通过操作同一data.table中的其他几列来计算多个列

时间:2018-06-08 00:02:14

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

我正在寻找一种方法来将data.table(DT)的几列乘以同一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 * y1和z2 = 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]

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

2 个答案:

答案 0 :(得分:2)

可能是品味问题,但您可以使用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可用于返回特定环境中存在的对象列表。 ls默认搜索父环境,这是调用它的data.table的环境。因此,如果您有一个名为x3的对象存在于data.table之外,您不必担心:该对象被忽略。

答案 1 :(得分:0)

我通过搜索代码找到了这个答案R data.table calculate new columns in lapply&#34; data.table&#34; +&#34;计算列&#34;。通过扩展,我的问题的答案是:

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

虽然这显然是一个答案,但我可能无法找到它,因为我认为标题缺乏特异性。那就是说,有没有更简单的方法来解决这里提出的问题?