[R] setting a number of values to NA over a data.frame.

John Kane jrkrideau at yahoo.ca
Thu Feb 8 01:06:36 CET 2007


Works beautifully. I modified it a bit to handle the
discontinous ranges to:  

a <- c(3:4, 8)

data1[a] <- data.frame(lapply(data1[a], function(x)
ifelse(x==1,
NA,
x)))

There may be a prettier way to handle the disconituity
but this works so it looks like I'm in good shape.  

I had looked at ifelse and at apply (not lapply) but
did not think to put them together.  

Thanks 
Thanks very muc


--- Erik Iverson <iverson at biostat.wisc.edu> wrote:

> John -
> 
> Your initial problem uses 0, but the example uses 1
> for the value that 
> gets an NA.  My solution uses 1 to fit with your
> example.  There may be 
> a better way, but try something like
> 
> data1[3:5] <- data.frame(lapply(data1[3:5],
> function(x) ifelse(x==1, NA, 
> x)))
> 
> The data1[3:5] is just a test subset  of columns I
> chose from your data1 
> example.  Notice it appears twice, once on each side
> of the assignment 
> operator.
> 
> In English, apply to each column of the data frame
> (which is a list) a 
> function that will return NA if the element is 1,
> and the value 
> otherwise, and then turn the modified lists into a
> data.frame, and save 
> it as data1.
> 
> 
> 
> See the help files for lapply and ifelse if you
> haven't seen those before.
> 
> Maybe someone has a better way?
> 
> Erik
> 
> John Kane wrote:
> > This is probably a simple problem but I don't see
> a
> > solution.
> > 
> > I have a data.frame with a number of columns where
> I
> > would like 0 <- NA
> > 
> > thus I have df1[,144:157] <- NA if df1[, 144: 157]
> ==0
> > and df1[, 190:198] <- NA if df1[, 190:198] ==0
> > 
> > but I cannot figure out a way do this.  
> > 
> > cata <- c( 1,1,6,1,1,NA)
> > catb <- c( 1,2,3,4,5,6)
> > doga <- c(3,5,3,6,4, 0)
> > dogb <- c(2,4,6,8,10, 12)
> > rata <- c (NA, 9, 9, 8, 9, 8)
> > ratb <- c( 1,2,3,4,5,6)
> > bata <- c( 12, 42,NA, 45, 32, 54)
> > batb <- c( 13, 15, 17,19,21,23)
> > id <- c('a', 'b', 'b', 'c', 'a', 'b')
> > site <- c(1,1,4,4,1,4)
> > mat1 <-  cbind(cata, catb, doga, dogb, rata, ratb,
> > bata, batb)
> > 
> > data1 <- data.frame(site, id, mat1)
> > data1
> > 
> >  # Obviously this works fine for one column
> > 
> > data1$site[data1$site ==1] <- NA  ; data1
> > 
> > but I cannot see how to do this with indices that
> > would allow me to do more than one column in the
> > data.frame.
> > 
> > At one point I even tried something like this
> > a <- c("site")
> > data1$a[data1$a ==1] <- NA
> > 
> > which seems to produce a corrupt data.frame.
> > 
> > I am sure it is simple but I don't see it.  
> > 
> > Any help would be much appreciated.
> > 
> > ______________________________________________
> > R-help at stat.math.ethz.ch 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