替换数据框中的数字

时间:2014-03-22 13:31:27

标签: r

我有一个数据框,偶尔会有-1个。我想用NA替换它们。我尝试了apply函数,但它返回了一个字符矩阵给我,这是不好的:

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

我正在和by搏斗,但我似乎无法正确处理它。到目前为止我有这个:

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

如果我理解正确,by()会逐行归入x我的数据帧。我可以通过for函数遍历行的每个元素。我只是不知道如何更换价值。

2 个答案:

答案 0 :(得分:1)

您可以使用data.table库快速透明地完成此操作。

# take standard dataset and transform to data.table
mtcars = data.table(mtcars,keep.rownames = TRUE)

# select rows with 5 gear and set to NA
mtcars[gear==5,gear:= NA]
mtcars

答案 1 :(得分:1)

apply不起作用的原因是它将数据帧转换为矩阵,如果您的数据框有任何因素,那么这将是一个字符矩阵。

您可以使用lapply代替,它将一次处理一列数据框。此代码有效:

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

正如@rawr在评论中提到的那样:

mydf[ mydf== -1 ] <- NA

但文档(?'[.data.frame')表示由于转换而不建议这样做。

一个重要问题是如何创建数据框。如果您正在使用read.table或相关函数读取数据,那么您只需指定na.strings参数,并在读入数据时为您完成转换。