[R] conditional statement to replace values in dataframe with NA

peter dalgaard pdalgd at gmail.com
Thu Jun 7 08:59:36 CEST 2012


On Jun 7, 2012, at 07:28 , Bert Gunter wrote:

> Actually, recycling makes the rep(NA,2) business unnecessary. Simply:
> 
> dat1[dat1$x==1 & dat1$y==1,1:2] <- rep(NA,2)
> 
> ##or
> 
> with(dat1,{dat1[x==1 & y==1,1:2] <- NA;dat1})
> 
> will do it.
> 

Or, use the assignment form of is.na:

cond <- with(dat1, x==1 & y==1)
is.na(dat1$x) <- cond
is.na(dat1$y) <- cond

This is said to be somewhat safer if you are modifying factors (avoids potential confusion if NA is a level).

-pd


> -- Bert
> 
> 
> On Wed, Jun 6, 2012 at 10:21 PM, Bert Gunter <bgunter at gene.com> wrote:
>> Have you read "An Intro to R?" If not,please do so before posting
>> further. The way you are going about things makes me think you
>> haven't, but ...
>> 
>> This **is** a slightly tricky application of indexing, if I understand
>> you correctly. Here are two essentially identical ways to do it, but
>> the second is a little trickier
>> 
>> ## First
>>> dat1[dat1$x==1 & dat1$y==1,1:2] <- rep(NA,2)
>>> dat1
>>     x    y fac
>> 1 <NA> <NA>   A
>> 2    1    2   B
>> 3    1    3   A
>> 4 <NA> <NA>   C
>> 5    1    2   A
>> 6    1    3   C
>> 
>> ##Slightly trickier version using with() to avoid explicit extraction
>> from data frame
>> ## Reconstitute dat1
>> 
>>> dat1
>>  x y fac
>> 1 1 1   C
>> 2 1 2   C
>> 3 1 3   B
>> 4 1 1   B
>> 5 1 2   C
>> 6 1 3   B
>> 
>> dat1 <- with(dat1,{dat1[x==1 & y==1,1:2] <- rep(NA,2); dat1})
>>> dat1
>>     x    y fac
>> 1 <NA> <NA>   B
>> 2    1    2   A
>> 3    1    3   A
>> 4 <NA> <NA>   C
>> 5    1    2   A
>> 6    1    3   B
>> 
>> ## ?with for explanation
>> 
>> -- Bert
>> 
>> On Wed, Jun 6, 2012 at 8:58 PM, Daisy Englert Duursma
>> <daisy.duursma at gmail.com> wrote:
>>> Hello and thanks for helping.
>>> 
>>> #some data
>>> L3 <- LETTERS[1:3]
>>> dat1 <- data.frame(cbind(x=1, y=rep(1:3,2), fac=sample(L3, 6, replace=TRUE)))
>>> 
>>> 
>>> #When x==1 and y==1 I want to replace the 1 values with NA
>>> 
>>> #I can select the rows I want:
>>> dat2<-subset(dat1,x==1 & y==1)
>>> #replace the 1 with NA
>>> dat2$x<-rep(NA,nrow(dat2)
>>> dat2$y<-rep(NA,nrow(dat2)
>>> 
>>> #select the other rows and rbind everything back together
>>> #This is where I get stuck
>>> 
>>> #The end dataframe will look something like:
>>> 
>>>   x y  fac
>>> NA NA   B
>>> NA NA   A
>>> 1 2   C
>>> 1 3   C
>>> 1 2   C
>>> 1 3   A
>>> 
>>> #Is there a better way to do this where I do not need to subset
>>> perhaps using lapply?
>>> 
>>> 
>>> Thanks,
>>> Daisy
>>> 
>>> --
>>> Daisy Englert Duursma
>>> Department of Biological Sciences
>>> Room E8C156
>>> Macquarie University, North Ryde, NSW 2109
>>> Australia
>>> 
>>> Tel +61 2 9850 9256
>>> 
>>> ______________________________________________
>>> 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.
>> 
>> 
>> 
>> --
>> 
>> Bert Gunter
>> Genentech Nonclinical Biostatistics
>> 
>> Internal Contact Info:
>> Phone: 467-7374
>> Website:
>> http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
> 
> 
> 
> -- 
> 
> Bert Gunter
> Genentech Nonclinical Biostatistics
> 
> Internal Contact Info:
> Phone: 467-7374
> Website:
> http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
> 
> ______________________________________________
> 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.

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com



More information about the R-help mailing list