【问题标题】:R data.table - multiply two columns whose components are matricesR data.table - 将两列相乘,其成分是矩阵
【发布时间】:2020-01-12 18:01:31
【问题描述】:

我有一个 data.table,其中包含一些数字列和另一列,其中每个条目都是一个矩阵。这是一个例子:

dt = data.table(a = c(1,2,3), b = c(-1,4,2))
dt$c = vector("list",3)
for (ind in 1:3){dt$c[[ind]] = round(matrix(10*runif(8), nrow = 4))}

对于每一行,我想将 a 和 b 列形成的数字向量与 c 中相应的 4 x 2 矩阵相乘,并将得到的 4 个数字存储到 V1、V2、V3 和 V4 列中。例如,对于第一行,我将采用 4 x 2 矩阵 dt$c[[1]],将其与 2 x 1 向量 rbind(dt$a[1],dt$b[1]) 相乘,并将得到的 4 个数字分配到 4 个新列的第一行命名为 V1、V2、V3 和 V4。

我正在寻找一种本机 data.table 方法来执行此操作。我目前正在遍历所有行,这对于我的实际问题大小来说太慢了。尝试了各种 data.table 语法,但我怀疑我在 c 列内部被视为列表的方式中遗漏了一些基本的东西,因此我无法让矩阵乘法工作。

对此的任何帮助将不胜感激。

【问题讨论】:

  • rbind时的行数与'c'的行数不匹配。不清楚这里的尺寸。因为如果你相乘,那么输出是 4 x 2 行 Xcolumn 矩阵,即c(dt$a[1],dt$b[1]) * dt$c[[1]]
  • @akrun - C 的每个条目都是一个 4x2 矩阵,我用 a 和 b 制作了一个 2x1 向量。然后我做一个矩阵乘法 (dt$C[[1]] %*% rbind(dt$a[1],dt$b[1])

标签: r data.table


【解决方案1】:

我们可以使用Map来做对应的列值相乘

dt[, paste0("V", 1:4) := do.call(rbind.data.frame,
        Map(function(x, y, z) t(z %*% c(x, y)) , a, b, c))]
dt
#   a  b                           c V1 V2 V3 V4
#1: 1 -1  1, 7, 4,10, 9, 7, 4, 1,... -8  0  0  9
#2: 2  4  1, 8, 8, 4, 7, 1, 5,10,... 30 20 36 48
#3: 3  2  6, 6, 9, 5, 0, 0,10, 2,... 18 18 47 19

【讨论】:

  • 太棒了!!! Map 成功了,看起来是一个非常强大的 data.table 功能。肯定会探索更多并将其内化以供将来的用例使用。感谢您的及时回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 2017-10-09
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多