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

Bert Gunter gunter.berton at gene.com
Thu Jun 7 07:28:10 CEST 2012


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.

-- 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



More information about the R-help mailing list