我正在寻找一种方法来将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]
当然必须有一种优雅的方式来做到这一点。
答案 0 :(得分:2)
可能是品味问题,但您可以使用Map
并构建一些列表来提供它。
DT[, c("z1", "z2") := Map("*", list(x1, x2), list(y1, y2))]
扩展到许多变量与mget
和ls
结合,执行
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
我只是提到带有模式的mget
和ls
可用于返回特定环境中存在的对象列表。 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
虽然这显然是一个答案,但我可能无法找到它,因为我认为标题缺乏特异性。那就是说,有没有更简单的方法来解决这里提出的问题?