【问题标题】:Non-conformable arguments when using apply使用 apply 时参数不一致
【发布时间】:2020-06-27 22:04:40
【问题描述】:

我有一个 10000 x 7 的 data.table dat 。我想将每一行 dat 乘以一个 7x7 矩阵 c。我已经尝试了以下

apply(dat, 1, function(x) sqrt(as.matrix(x)  %*%  as.matrix(c)  %*%  t(as.matrix(x))))

我收到此错误

as.matrix(x) %*% as.matrix(c) 中的错误:参数不一致

当我从 dat 中取一行(所以 1 x 7)时,此函数有效,但在我使用 apply 时无效。

如何使用 apply 来完成这项工作?

谢谢!

附加信息 - 我可以通过另一种方式实现我需要的东西。我可以将整个 data.frame 乘以矩阵并取 sqrt(diag(x))。但是,我需要这样做很多次,因此逐行获取并返回单个数字会更有效。

【问题讨论】:

    标签: r matrix apply


    【解决方案1】:

    注意:c()是R中常用的函数,因此使用c作为变量名不是很好的做法,我在下面改用c_

    当矩阵相乘时,第一个矩阵中的列数需要与第二个矩阵中的行数相同。在代码中的 as.matrix(x) %*% as.matrix(c) 部分中,第一个矩阵有一列,第二个矩阵有 7 行。这就是您收到错误的原因。

    先将dat 的转置行与c 相乘,然后行修复此问题。

    apply(dat2, 1, function(x) sqrt(t(as.matrix(x))  %*%  as.matrix(c_)  %*%  (as.matrix(x))))
    

    或者使函数更明确地处理您想要从行创建的矩阵也可以:

    apply(dat, 1, function(x) sqrt(matrix(x, 1)  %*%  c_  %*%  t(matrix(x, 1))))
    

    两种解决方案产生相同的结果。

    【讨论】:

      【解决方案2】:

      我认为您应该在 apply 函数中使用 t(as.matrix(x))%*% as.matrix(c) %*% as.matrix(x),因为参数 as.matrix(x) 确实是列向量(而不是行向量)。

      res <- apply(dat, 1, function(x) sqrt(t(as.matrix(x))%*% as.matrix(c) %*% as.matrix(x)))
      

      示例

      set.seed(1)
      dat <- data.frame(matrix(sample(70),ncol = 7))
      c <- matrix(sample(49),ncol = 7)
      res <- apply(dat, 1, function(x) sqrt(t(as.matrix(x))%*% as.matrix(c) %*% as.matrix(x)))
      

      这样

      > res
       [1] 1522.7206 1208.6306 1105.7509 1063.4341 1066.3423 1124.8271
       [7] 1219.2280 1665.8301 1609.4704  954.3694
      

      【讨论】:

        猜你喜欢
        • 2019-05-29
        • 2017-07-24
        • 1970-01-01
        • 2021-08-06
        • 2019-06-17
        • 2017-09-14
        • 2015-12-15
        • 2013-08-15
        • 1970-01-01
        相关资源
        最近更新 更多