r data.table条件和引用/从另一个单独的data.table执行查找

时间:2016-07-07 18:30:20

标签: r data.table

我是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,对吧?

1 个答案:

答案 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