我想,以取代0
由NA
在的每一列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值)转换为NA
1和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
的数据集或更高效的数据集.
归档时间: |
|
查看次数: |
4425 次 |
最近记录: |