我有一个大数据集(几百万行)存储为data.table(我目前正在学习使用该包)。它的格式如下(只是相关列):
DT=data.table("a"=c(11,11,11,12,13,13),"b"=c("x", "y", "z", "y", "x", "y"))
DT
a b
1: 11 x
2: 11 y
3: 11 z
4: 12 y
5: 13 x
6: 13 y
我正在尝试构建一个基于“a”中的值输入的函数,在“b”(列表A)中查找与其关联的所有值,然后搜索“a”中的剩余值并返回“b”中具有最多值的值与列表A中的值匹配的那个。
e.g。对于a = 11,列表A是“x,y,z”,对于a = 13,列表A是“x,y” a = 13的期望结果是a = 11(匹配2个值 - “x,y”)
我正在努力寻找最有效的方法。 到目前为止我尝试的是:
toMatch=3
setkey(DT,a)
vals=DT[list(toMatch)]$b
vals
[1] "x" "y"
setkey(DT,b)
temp=data.table("listA"=DT[list(vals)]$a)
temp[,.N, by = names(temp)][order(-N)]
temp
listA N
1: 11 2
2: 31 2
3: 21 1
best=temp[listA!=toMatch][1]
listA
1: 11
这给出了期望的结果,但需要重置密钥(每次都不可行)或构造辅助表,每个辅助表都有自己的密钥。 如前所述,我现在才学习使用data.table - 我相信有更有效的方法来实现这一点。
感谢您的帮助!