Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace a number in dataframe

Tags:

r

I have a dataframe in which I occasionally have -1s. I want to replace them with NA. I tried the apply function, but it returns a matrix of characters to me, which is no good:

 apply(d,c(1,2), function(x){
   if (x == -1){
      return (NA)
   }else{
      return (x)
   }
 })

I am wrestling with by but I cannot seem to handle it properly. I have got this so far:

 s <-by(d,d[,'Q1_I1'], function(x){
     for(i in x)
        print(i)
})

which if I understood correctly by() serves into x my dataframe row by row. And I can iterate through the each element of the row by the for function. I just don't know how to replace the value.

like image 292
Pio Avatar asked Jun 11 '26 11:06

Pio


1 Answers

The reason that apply does not work is that it converts a data frame to a matrix and if your data frame has any factors then this will be a character matrix.

You can use lapply instead which will process the data frame one column at a time. This code works:

mydf <- data.frame( x=c(1:10, -1), y=c(-1, 10:1), g=sample(letters,11) )
mydf
mydf[] <- lapply(mydf, function(x) { x[x==-1] <- NA; x})
mydf

As @rawr mentions in the comments it does work to do:

mydf[ mydf== -1 ] <- NA

but the documentation (?'[.data.frame') say that that is not recommended due to the conversions.

One big question is how the data frame is being created. If you are reading the data using read.table or related functions then you can just specify the na.strings argument and have the conversion done for you as the data is read in.

like image 173
Greg Snow Avatar answered Jun 14 '26 06:06

Greg Snow



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!