【发布时间】: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