【问题标题】:r data.table conditional sum referencing / performing a lookup from another separate data.tabler data.table 条件和引用/从另一个单独的 data.table 执行查找
【发布时间】:2016-07-07 18:30:19
【问题描述】:

我是 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 列 >= BB 列

换句话说,总和 EE,其中 AA = CC AND 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 的每一行效率低吗?

我还想知道如何使其可扩展,即添加几个条件(例如,多个大于、小于、等于混合“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 data.tables 中一定也比较容易,对吧?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    在最新的dev 1.9.7 version中使用非equi连接的魔力:

    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

    【讨论】:

    • 成功了!!!谢谢你埃迪!对于任何为如何安装 1.9.7(我在 Windows 环境中)而苦苦挣扎的人,我发现在安装 Rtools 时必须选择“编辑路径”选项才能使其正常工作。我重新启动了。
    猜你喜欢
    • 2021-11-27
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多