# [R] transform a df with a condition

Duncan Murdoch murdoch.duncan at gmail.com
Sun Jan 16 15:53:54 CET 2011

```On 16/01/2011 9:13 AM, Patrick Hausmann wrote:
> Dear all,
>
> for each A == 3 in 'df' I would like to change the variables B and K.
> My result should be the whole df and not the subset (A==3)...
>
> df<- data.frame(A = c(1,1,3,2,2,3,3),
>                    B = c(2,1,1,2,7,8,7),
>                    K = c("a.1", "d.2", "f.3",
>                          "a.1", "k.4", "f.9", "f.5"))
>
> x1<- within(df[df\$A ==3, ], {

This is the problem:  you've subsetted the dataset here, and lost all
the other lines.  You want something like this:

x3 <- within(df, {
B <- ifelse(A == 3, 5, B)
K <- ifelse(A == 3, gsub("f", "m", K), as.character(K)) }
)

You need the "as.character" as by default K will be a factor, not a
character vector, and ifelse will take the factor level instead of the
label.

If the condition was more complicated than A == 3, you might want to
calculate it first and use the calculated value each time:

x3 <- within(df, {
changes <- A == 3
B <- ifelse(changes, 5, B)
K <- ifelse(changes, gsub("f", "m", K), as.character(K))
rm(changes)
}
)

>          B1<- 5
>          K1<- gsub("f","m", K)
>          })
>
> x2<- transform(df[df\$A==3, ], B1 = 5, K1 = gsub("f","m", K))
>
> Thanks for any help!
> Patrick
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help