我有一个数据框,偶尔会有-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
函数遍历行的每个元素。我只是不知道如何更换价值。
答案 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
参数,并在读入数据时为您完成转换。