On Aug 31, 2015, at 1:49 PM, Luigi Marongiu wrote: > Dear all, > I have a data frame and I would like to do the following: > a) replace value of one variable "a" according to the value of another one "b" > b) remove all the instances of the variable "b" > > For the sake of argument, let's say I have the following data frame: > test <- rep(c("Adenovirus", "Rotavirus", "Norovirus", "Rotarix", > "Sapovirus"), 3) > res <- c(0, 1, 0, 0, 1, > 1, 0, 1, 1, 0, > 0, 1, 0, 1, 0) > samp <- c(rep(1, 5), rep(2, 5), rep(3, 5)) > df <- data.frame(test, res, samp, stringsAsFactors = FALSE) > > The task I need is to coerce the results of the "Rotavirus" to > negative (0) if and only if "Rotarix" is positive (1). In this > example, the results shows that for "samp" 3 "Rotavirus" should be 0: > test res samp > 2 Rotavirus 1 1 > 4 Rotarix 0 1 > 7 Rotavirus 0 2 > 9 Rotarix 1 2 > 12 Rotavirus 1 3 > 14 Rotarix 1 3 > > I can't use the subset function because then I would work on a > separate object and I don't know how to implement the conditions for > the replacements. > Finally, all the "Rotarix" entries should be removed from the data frame.
>From context it appears you want to do this testing within groups determined >by 'samp', so you might choose to use an lapply-split approach: lapply( split(df, df$samp), FUN=function(d) if ( d[d$test =="Rotarix", "res"] ) { d$res[d$test=="Rotavirus"] <- 0 ; return( d[!d$test=="Rotarix", ] ) } else { d[!d$test=="Rotarix", ]} ) $`1` test res samp 1 Adenovirus 0 1 2 Rotavirus 1 1 3 Norovirus 0 1 5 Sapovirus 1 1 $`2` test res samp 6 Adenovirus 1 2 7 Rotavirus 0 2 8 Norovirus 1 2 10 Sapovirus 0 2 $`3` test res samp 11 Adenovirus 0 3 12 Rotavirus 0 3 13 Norovirus 0 3 15 Sapovirus 0 3 It's pretty easy to rbind.data.frame those together > do.call( rbind.data.frame, lapply( split(df, df$samp), FUN=function(d) if ( > d[d$test =="Rotarix", "res"] ) { d$res[d$test=="Rotavirus"] <- 0 ; return( > d[!d$test=="Rotarix", ] ) } else { d[!d$test=="Rotarix", ]} ) ) test res samp 1.1 Adenovirus 0 1 1.2 Rotavirus 1 1 1.3 Norovirus 0 1 1.5 Sapovirus 1 1 2.6 Adenovirus 1 2 2.7 Rotavirus 0 2 2.8 Norovirus 1 2 2.10 Sapovirus 0 2 3.11 Adenovirus 0 3 3.12 Rotavirus 0 3 3.13 Norovirus 0 3 3.15 Sapovirus 0 3 > Thank you. > Best regards, > Luigi > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. David Winsemius Alameda, CA, USA ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.