data.table用NA替换值

MYa*_*208 5 r data.table

我想,以取代0NA在的每一列data.table.

library(data.table)
dt1 <- data.table(V1=0:2, V2=2:0)
dt1

   V1 V2
1:  0  2
2:  1  1
3:  2  0

dt1==0
       V1    V2
[1,]  TRUE FALSE
[2,] FALSE FALSE
[3,] FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

我试过这个

dt1[dt1==0] 
Error in `[.data.table`(dt1, dt1 == 0) : 
  i is invalid type (matrix). Perhaps in future a 2 column matrix could return a list of elements of DT (in the spirit of A[B] in FAQ 2.14). Please let datatable-help know if you'd like this, or add your comments to FR #1611.
Run Code Online (Sandbox Code Playgroud)

并尝试了这一个

dt1[dt1==0, .SD :=NA] 
Run Code Online (Sandbox Code Playgroud)

编辑

局部 sessionInfo()

R version 3.2.1 (2015-06-18)
Platform: i686-pc-linux-gnu (32-bit)
Running under: Ubuntu 14.04.2 LTS

data.table_1.9.4
Run Code Online (Sandbox Code Playgroud)

akr*_*run 13

您可以尝试set多列.它会更快,因为.[data.table避免了开销

for(j in seq_along(dt1)){
         set(dt1, i=which(dt1[[j]]==0), j=j, value=NA)
}
dt1
#   V1 V2
#1: NA  2
#2:  1  1
#3:  2 NA
Run Code Online (Sandbox Code Playgroud)

或者另一个选项是循环,lapply然后将0值更改为NAreplace

dt1[, lapply(.SD, function(x) replace(x, which(x==0), NA))]
Run Code Online (Sandbox Code Playgroud)

或者我们可以利用一些关系算术运算将0值转换为NA.

 dt1[, lapply(.SD, function(x) (NA^!x) *x)]
Run Code Online (Sandbox Code Playgroud)

这种方式的(NA^!x)*x工作方式是将!x每个列的逻辑TRUE/FALSE向量(其中TRUE对应于0值)转换为NA1和1 NA^!x.我们乘以x值将1替换为与其对应的x值,而NA将保持原样.

或类似的语法与base R

  is.na(dt1) <- dt1==0
Run Code Online (Sandbox Code Playgroud)

但是这种方法对于大数据可能效率不高.dt1==0可能是逻辑矩阵,也可能是@Roland在评论中提到的数据集将被复制.我会使用lapply基于更高效set的数据集或更高效的数据集.