我有一个数据表,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
然而,当我将其应用于我的实际数据集时,我错过了最初约200万行的大约20%。
我似乎无法将一个将重新创建此类损失的测试数据集放在一起。实际数据集中没有空值。数据集中还有哪些因素会导致test[,.SD[.N],by="A"]
和length(unique(test$A))
之类的结果数之间出现差异?
答案 0 :(得分:3)
感谢@ Eddi的调试指导,至少对我的数据集来说,答案是:答案是:用科学记数法对数字进行差分处理。
特别是:在我的实际数据集中,列A和B是非常长的数字,从SQL导入到R时,已经以科学计数法导入。事实证明,test[,.SD[.N],by="A"]
和length(unique(test$A))
命令处理的方式不同:length(unique(test$A))
保留了两个值之间的差异,这两个值仅在以折叠的科学记数法格式不可见的小数字中有所不同打印为视觉输出,但test[,.SD[.N],by="A"]
实质上是对值进行四舍五入,从而将其中的一些折叠在一起。
(我觉得很愚蠢,我在发布之前没有抓住这个,但非常感谢帮助 - 我希望不管怎么说,这可能会让其他人感到同样的混乱!)