我是R和data.tables的初学者,但已经阅读了足够的信息,可以确信他们对大型数据集的速度/效率。我已经搜索过高低,无法找到我认为容易出问题的答案。
这里的问题是:给定两个数据表DT1和DT2
DT1 <- data.table(AA=c("A","B","C","A","B","C","A","B","C","A","B","C"),
BB=c(35,45,25,25,85,15,55,55,95,35,25,75)
)
DT2 <- data.table(CC=c("A","B","C","A","B","C"),
DD=c(10,20,30,40,50,60),
EE=c(5,5,10,10,15,20)
)
如果给定DT1每行的现有值,如果满足多个条件,如何向DT1添加一个新列(称为NewCol),该列对DT2的EE列求和:
1)AA列= CC列
2)列DD&gt; = BB列
换句话说,总和EE,其中AA = CC且DD> = BB。
所需的输出是:
DT1_DesiredOutput <- data.table(AA=c("A","B","C","A","B","C","A","B","C","A","B","C"),
BB=c(35,45,25,25,85,15,55,55,95,35,25,75),
NewCol=c(10,15,30,10,0,30,0,0,0,10,15,0)
)
加入?合并?组?别的什么?猜测循环DT1的每一行是否效率低下?
我也想知道如何使它可扩展,即添加几个条件(例如,几个大于,小于,等于混合值#34; ANDs&#34;和&#34 ; OR值&#34;。)
非常感谢!
p.s。,这是Excel中的小菜一碟( cough 次优,我知道),有一个数组公式,如
{=SUM(IF( ($F$7:$F$12=B7)*($G$7:$G$12>C7), $H$7:$H$12))}
复制到NewCol的每个单元格中。我不想用两个Excel表格来混淆帖子,显然Excel并不是很好,原因很多,但如果它在Excel中很容易,那么它在R中必须比较容易。 data.tables,对吧?
答案 0 :(得分:5)
在最新的dev 1.9.7 version:
中使用非等联接的魔力DT2[DT1, on = .(CC = AA, DD >= BB), .(NewCol = sum(EE, na.rm = T)), by = .EACHI]
# CC DD NewCol
# 1: A 35 10
# 2: B 45 15
# 3: C 25 30
# 4: A 25 10
# 5: B 85 0
# 6: C 15 30
# 7: A 55 0
# 8: B 55 0
# 9: C 95 0
#10: A 35 10
#11: B 25 15
#12: C 75 0
希望结果连接列的命名在未来变得更合乎逻辑,现在只需使用setnames
。