[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