[R] How do I 'merge' a altered subset of a data.frame back into the same data.frame
Marc Schwartz
marc_schwartz at me.com
Fri Jun 4 20:39:17 CEST 2010
On Jun 4, 2010, at 1:09 PM, dominik beck wrote:
> Hi
>
> Step 1: I create a data.frame called iolm.
> Step 2: I create a conditional subset i_wtr.
> Step 3: In this subset I add 0.3 to all values in the IOLM_AST column.
> Step 4: Now I am looking for the best way to ‘merge’ the altered subset back
> into the original iolm data.frame
>
> ## STEP 1
>> iolm
> ID IOLM_AST IOLM_AXIS
> 1 1 1.15 165.33
> 2 2 1.20 79.00
> 3 3 0.40 51.66
> 4 4 0.50 57.00
> 5 5 1.77 7.70
> 6 6 0.28 99.70
> 7 7 0.48 160.00
> 8 8 0.74 84.00
> 9 9 1.63 87.00
> 10 10 0.43 150.70
> ....
>
> ## STEP 2
>
>> i_wtr<-subset(iolm,IOLM_AXIS > 60 & IOLM_AXIS < 120)
>> i_wtr
> ID IOLM_AST IOLM_AXIS
> 2 2 1.20 79.0
> 6 6 0.28 99.7
> 8 8 0.74 84.0
> 9 9 1.63 87.0
> 16 16 0.93 94.0
> 20 20 1.37 91.0
> 21 21 1.19 63.0
> ...
>
> ## STEP 3
>
> i_wtr$IOLM_AST <- i_wtr$IOLM_AST + 0.3
>> i_wtr
> ID IOLM_AST IOLM_AXIS
> 2 2 1.50 79.0
> 6 6 0.58 99.7
> 8 8 1.04 84.0
> 9 9 1.93 87.0
> 16 16 1.23 94.0
> 20 20 1.67 91.0
> 21 21 1.49 63.0
> ...
>
> ## STEP 4 – result (not what I wish to get)
>
> newiolm<-merge(i_wtr, iolm, by.x="ID", by.y="ID", all = T)
>> newiolm
> ID IOLM_AST.x IOLM_AXIS.x IOLM_AST.y IOLM_AXIS.y
> 1 1 NA NA 1.15 165.33
> 2 2 1.50 79.0 1.20 79.00
> 3 3 NA NA 0.40 51.66
> 4 4 NA NA 0.50 57.00
> 5 5 NA NA 1.77 7.70
> 6 6 0.58 99.7 0.28 99.70
> 7 7 NA NA 0.48 160.00
> 8 8 1.04 84.0 0.74 84.00
> 9 9 1.93 87.0 1.63 87.00
> 10 10 NA NA 0.43 150.70
> ...
>
>
> ## The result I am looking to get:
>
> ID IOLM_AST IOLM_AXIS
> 1 1 1.15 165.33
> 2 2 1.50 79.00
> 3 3 0.40 51.66
> 4 4 0.50 57.00
> 5 5 1.77 7.70
> 6 6 0.58 99.70
> 7 7 0.48 160.00
> 8 8 1.04 84.00
> 9 9 1.93 87.00
> 10 10 0.43 150.70
> ...
>
> What is the correct way to do this?
> Thanks a lot for your help.
> Dominik
Just replace the values that meet the condition with the new values, leaving the others alone:
> iolm
ID IOLM_AST IOLM_AXIS
1 1 1.15 165.33
2 2 1.20 79.00
3 3 0.40 51.66
4 4 0.50 57.00
5 5 1.77 7.70
6 6 0.28 99.70
7 7 0.48 160.00
8 8 0.74 84.00
9 9 1.63 87.00
10 10 0.43 150.70
# See ?ifelse and ?with
> with(iolm, ifelse(IOLM_AXIS > 60 & IOLM_AXIS < 120,
IOLM_AST + 0.3,
IOLM_AST))
[1] 1.15 1.50 0.40 0.50 1.77 0.58 0.48 1.04 1.93 0.43
# Replace the original column with the above result
iolm$IOLM_AST <- with(iolm, ifelse(IOLM_AXIS > 60 & IOLM_AXIS < 120,
IOLM_AST + 0.3,
IOLM_AST))
> iolm
ID IOLM_AST IOLM_AXIS
1 1 1.15 165.33
2 2 1.50 79.00
3 3 0.40 51.66
4 4 0.50 57.00
5 5 1.77 7.70
6 6 0.58 99.70
7 7 0.48 160.00
8 8 1.04 84.00
9 9 1.93 87.00
10 10 0.43 150.70
HTH,
Marc Schwartz
More information about the R-help
mailing list