【问题标题】:Multiply several sets of columns in the same data.table将同一 data.table 中的几组列相乘
【发布时间】:2018-06-08 00:02:13
【问题描述】:

我正在寻找一种方法,将 data.table 的几列乘以同一 DT 中的其他几列。另一篇文章侧重于在同一 DT Multiply many columns by a specific other column in R with data.table? 中将许多列乘以 特定 列的方法。我的问题扩大了这个先前的问题。

从此 DT 开始:

DT <- data.table(x1 = 1:5L, y1 = 6:10L, x2 = 11:15L, y2 = 16:20L)

   x1 y1 x2 y2
1:  1  6 11 16
2:  2  7 12 17
3:  3  8 13 18
4:  4  9 14 19
5:  5 10 15 20

我想将z1 = x1 * y1z2 = x2 * y2相乘得到

   x1 y1 x2 y2 z1  z2
1:  1  6 11 16  6 176
2:  2  7 12 17 14 204
3:  3  8 13 18 24 234
4:  4  9 14 19 36 266
5:  5 10 15 20 50 300

这是构建所需DT的蛮力方法:

DT2[, ':='(z1 = x1 * y1, z2 = x2 * y2]

当然必须有一种优雅的方式来做到这一点。

【问题讨论】:

    标签: r data.table multiple-columns calculated-columns


    【解决方案1】:

    可能是口味问题,但您可以使用 Map 并构建一些列表来提供它。

    DT[, c("z1", "z2") := Map("*", list(x1, x2), list(y1, y2))]
    

    结合mgetls 扩展到多个变量,这样做

    DT[, c("z1", "z2") := Map("*", mget(ls(pattern="x")), mget(ls(pattern="y")))]
    

    这两个都返回期望的结果

    DT
       x1 y1 x2 y2 z1  z2
    1:  1  6 11 16  6 176
    2:  2  7 12 17 14 204
    3:  3  8 13 18 24 234
    4:  4  9 14 19 36 266
    5:  5 10 15 20 50 300
    

    我只提一下mgetls with patterns 可用于返回存在于特定环境中的对象列表。 ls 默认搜索父环境,也就是调用它的data.table的环境。因此,如果您有一个名为 x3 的对象存在于 data.table 之外,您不必担心:该对象会被忽略。

    【讨论】:

      【解决方案2】:

      我通过搜索标签“data.table”+“calculated-columns”找到了这个答案R data.table calculate new columns in lapply。通过扩展,我的问题的答案是:

      DT <- data.table(x1 = 1:5L, y1 = 6:10L, x2 = 11:15L, y2 = 16:20L)
      FUN <- function(ndx, DT) {DT[, paste("z", ndx, sep = "") := get(paste("x", ndx, sep = "")) *  get(paste("y", ndx, sep = ""))]}
      lapply(1:2, FUN, DT)
      
      DT
      x1 y1 x2 y2 z1  z2
      1:  1  6 11 16  6 176
      2:  2  7 12 17 14 204
      3:  3  8 13 18 24 234
      4:  4  9 14 19 36 266
      5:  5 10 15 20 50 300
      

      虽然这显然是一个答案,但我找不到它也许是可以理解的,因为我认为标题缺乏特异性。也就是说,有没有更直接的方法来解决这里提出的问题?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-23
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 2019-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多