[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
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list