【问题标题】:data.table replacing a value by NA [duplicate]data.table 用 NA 替换值 [重复]
【发布时间】:2015-08-01 12:15:49
【问题描述】:

我想在data.table 的每一列中将0 替换为NA

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

我试过这个

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.

也试过这个

dt1[dt1==0, .SD :=NA] 

已编辑

部分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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以尝试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
    

    或者另一种选择是循环使用lapply,然后使用replace0 值更改为NA

    dt1[, lapply(.SD, function(x) replace(x, which(x==0), NA))]
    

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

     dt1[, lapply(.SD, function(x) (NA^!x) *x)]
    

    (NA^!x)*x 的工作方式是将!x 即每列的逻辑 TRUE/FALSE 向量(其中 TRUE 对应于 0 值)转换为 NA 和通过执行 NA^!x 转换为 1。我们乘以 x 值,将 1 替换为对应的 x 值,而 NA 将保持不变。

    或者类似于base R的语法是

      is.na(dt1) <- dt1==0
    

    但是这种方法对于大型 data.table 可能效率不高,因为 dt1==0 将是一个逻辑矩阵,并且正如 @Roland 在 cmets 中提到的那样,数据集将被复制。对于更大的数据集,我会使用基于lapply 或更高效的set

    【讨论】:

    • 如果你有一个大矩阵并且想要避免你的内存使用爆炸,你需要将 gc() 添加到循环中。
    【解决方案2】:

    dt1[dt1==0] &lt;- NA 为我工作。

    dt1[dt1==0] <- NA
    dt1
    ##   V1 V2
    ##1: NA  2
    ##2:  1  1
    ##3:  2 NA
    

    正如 Roland 所说,这确实会复制 data.table 对象,并且会更慢。

    【讨论】:

    • 我也是这样做的,但是dt1[dt1==0] 出现错误。
    • 这对我不起作用。不知道为什么?
    • 不要这样做。它会复制整个 data.table,当它的大小合适时会很慢。
    • @Roland 谢谢,很高兴知道!
    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2017-10-31
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    相关资源
    最近更新 更多