【问题标题】:Missing rows after subsetting datatable on a single column在单个列上对数据表进行子集化后缺少行
【发布时间】:2016-04-29 17:14:35
【问题描述】:

我有一个数据表 DT,其中包含 A、B 和 C 列。我只希望每个唯一 B 有一个 A,并且我想根据 C 的值选择那个 A(选择最大的 C)。

基于这个(非常有用的)SO 页面Use data.table to get first of subgroup based on a variable,我尝试了这样的事情:

test <- data.table(A=c(1:3,1:2),B=c(1:5),C=c(11:15))
setkey(test,A,C)
test[,.SD[.N],by="A"]

在我的测试用例中,这给了我一个似乎正确的答案:

#     A  B   C
# 1:  1  6  16
# 2:  2  7  17
# 3:  3  8  18
# 4:  4  4  14
# 5:  5  5  15

而且,正如预期的那样,行数与我的 DT 中“A”的唯一条目数相匹配:

length(unique(test$A))
# 5

但是,当我将其应用于我的实际数据集时,我丢失了大约 20% 的最初约 200 万行。

我似乎无法组合一个测试数据集来重新创建这种类型的损失。实际数据集中没有空值。数据集中还有什么因素会导致test[,.SD[.N],by="A"]length(unique(test$A)) 之类的结果数量之间存在差异?

【问题讨论】:

  • “类似的东西”或那些确切的命令,只是在不同的数据集上?
  • 另外,我不清楚为什么不简单地减少数据集,直到找到仍然表现出任何不良行为的最小可能数据集。只需删除最后 N 行 - 你仍然遇到同样的问题吗?不,那么问题出在最后 N 行。是的,然后删除更多行。对 2M 行进行二分搜索最多只需 21 步即可找到问题。
  • @eddi:确切的命令,只是更改了相应的列名。而且,好点。现在会做......
  • @eddi:啊!谢谢!!答案是:当我从原始 SQL 格式导入表格时,一些列被更改为科学计数法。我认为这只是从能够注意到两个值仅在视觉上最终数字中变化的角度来看很烦人,但看起来(令我惊讶的是)它基本上是在 by="A" 子集中对它们进行四舍五入,但是跟踪它们实际上在 length(unique()) 情况下是唯一的。感谢调试指导 - 非常感谢!
  • 太棒了,很高兴它成功了!浮点数的比较总是一个棘手的问题

标签: r data.table


【解决方案1】:

感谢@Eddi 的调试指导,这就是答案,至少对于我的数据集而言:科学记数法中数字的差分处理。

特别是:在我的实际数据集中,A 列和 B 列是非常长的数字,在从 SQL 导入到 R 时,它们是以科学计数法导入的。事实证明,test[,.SD[.N],by="A"]length(unique(test$A)) 命令的处理方式不同:length(unique(test$A)) 保留了两个值之间的差异,这些差异仅在一个小数字上有所不同,在作为视觉输出打印的折叠科学记数法格式中不可见,但是test[,.SD[.N],by="A"] 本质上是对值进行四舍五入,从而将其中一些值折叠在一起。

(我觉得自己在发布之前没有发现这一点很愚蠢,但非常感谢您的帮助 - 我希望这能以某种方式避免其他人同样的困惑,也许!)

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2019-09-29
    • 1970-01-01
    • 2020-09-23
    • 2016-01-14
    • 1970-01-01
    • 2013-08-15
    • 2017-04-02
    • 2016-09-28
    相关资源
    最近更新 更多