使用R的data.table在进行条件求和时,可以从另一个单独的data.table中进行引用/查找。

3

我刚开始学习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中添加一个名为NewCol的新列,如果满足以下条件,则从DT2中对列EE进行求和:
1. 列AA = 列CC 2. 列DD >= 列BB
换句话说,在AA = CC且DD >= BB的情况下对EE进行求和。
期望的输出结果是:
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的每一行效率低下?

我还想知道如何使其可扩展,即添加多个条件(例如,几个大于、小于、等于值混合“AND”和“OR”)。

非常感谢!

p.s.,在Excel中这很简单(咳咳,我知道不够优化),使用诸如以下数组公式:

{=SUM(IF( ($F$7:$F$12=B7)*($G$7:$G$12>C7), $H$7:$H$12))}

在每个NewCol单元格中复制。我不想用两个Excel表格来混淆这篇文章,显然,Excel在很多方面都不是很好,但如果在Excel中这么简单,那么在R数据表中也肯定很容易,对吧?

1个回答

5

在最新的dev 1.9.7版本中,使用非等连接的神奇功能:

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即可。

2
成功了!!!谢谢eddi!!! 对于任何在安装1.9.7时遇到困难的人(我在Windows环境中),我发现我必须选择“编辑PATH”选项来安装Rtools才能正常工作。然后我重启了电脑。 - ColoradoGranite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接