r - 在 R 中的 data.table 中选择 NA

标签 r select data.table missing-data na

如何选择数据表中主键中缺少值的所有行。

DT = data.table(x=rep(c("a","b",NA),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)   

选择特定值很容易
DT["a",]  

选择缺失值似乎需要矢量搜索。不能使用二分查找。我对么?
DT[NA,]# does not work
DT[is.na(x),] #does work

最佳答案

幸运的是,DT[is.na(x),]几乎和(例如)DT["a",] 一样快,所以在实践中,这可能并不重要:

library(data.table)
library(rbenchmark)

DT = data.table(x=rep(c("a","b",NA),each=3e6), y=c(1,3,6), v=1:9)
setkey(DT,x)  

benchmark(DT["a",],
          DT[is.na(x),],
          replications=20)
#             test replications elapsed relative user.self sys.self user.child
# 1      DT["a", ]           20    9.18    1.000      7.31     1.83         NA
# 2 DT[is.na(x), ]           20   10.55    1.149      8.69     1.85         NA

===

马修的补充(不适合评论):

不过,上面的数据有 3 个非常大的组。因此,二分查找的速度优势主要取决于创建大子集的时间(复制 1/3 的数据)。
benchmark(DT["a",],  # repeat select of large subset on my netbook
    DT[is.na(x),],
    replications=3)
          test replications elapsed relative user.self sys.self
     DT["a", ]            3   2.406    1.000     2.357    0.044
DT[is.na(x), ]            3   3.876    1.611     3.812    0.056

benchmark(DT["a",which=TRUE],   # isolate search time
    DT[is.na(x),which=TRUE],
    replications=3)
                      test replications elapsed relative user.self sys.self
     DT["a", which = TRUE]            3   0.492    1.000     0.492    0.000
DT[is.na(x), which = TRUE]            3   2.941    5.978     2.932    0.004

随着返回子集的大小减小(例如添加更多组),差异变得明显。单列上的矢量扫描还不错,但在 2 列或更多列上它会迅速降级。

也许 NA 应该可以加入。不过,我似乎记得一个问题。这是来自 FR#1043 Allow or disallow NA in keys? 的一些历史链接.它在那里提到 NA_integer_内部是一个负整数。这会导致基数/计数排序 (iirc) 跳闸导致 setkey走得更慢。但它在重新审视的 list 上。

关于r - 在 R 中的 data.table 中选择 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12646172/

相关文章:

r - 如何使用 RMongo 计算特定列的平均值?

r - 将 stat_summary 与 ggplot 一起使用时更改条宽

r - 从均值为 5、标准差为 3 的正态分布中模拟 5000 个大小为 5 的样本

r - 计算不包括当前值的平均值

mysql - 使用 FIND_IN_SET 选择记录

r - 统计两列中 ''反向''字符串匹配的出现次数

r - 提取置信区间 data.table

sql - 甲骨文 |查询输出以分号分隔

java - hibernate ,按 id 或唯一列选择

r - 如何访问包含特殊字符或空格的数据表列?