错误“需要数字/复杂矩阵/矢量参数”,即使参数是矩阵

时间:2018-10-08 09:49:42

标签: r dataframe matrix-multiplication rbind cbind

当我遇到一个我不理解的错误时,我正在编写一些用于计算简单汇总统计信息的函数。显然,我创建了一个类matrix的对象,当我尝试在矩阵乘法中使用该对象时会引发错误。下面的MWE计算iris数据集中(在l.apply.out2中的组均值以及每个组均值(在l.apply.out1中)的总和。然后将两个对象绑定在data.frame中。

现在,我的假设是我可以做进一步的计算,但是可以使用as.matrix将上面的data.frame转换为矩阵,但是下面的代码给出了错误Error in as.matrix(dat) %*% matrix(1, 3, 1) : requires numeric/complex matrix/vector arguments

data(iris)
s <- split(iris[,1:4],iris[,5])
l.apply.out1 <- lapply(s,function(x) {sum(colMeans(x))})
l.apply.out2 <- lapply(s,colMeans)

dat <- data.frame(rbind(matrix(l.apply.out1,1,3),matrix(unlist(l.apply.out2),4,3)))
as.matrix(dat)%*%matrix(1,3,1)

我可以通过使用rbind.data.frame来避免错误-可以按预期进行以下操作:

dat <-  rbind.data.frame(l.apply.out1,l.apply.out2)
as.matrix(dat)%*%matrix(1,3,1)

无论如何,哪个显然更清洁,但我真的想知道第一个示例到底出了什么问题?

1 个答案:

答案 0 :(得分:1)

让我们看看您进行as.matrix(l.apply.out2)时会发生什么:

data(iris)
s <- split(iris[,1:4], iris[,5])
l.apply.out1 <- lapply(s, function(x) {sum(colMeans(x))})
l.apply.out2 <- lapply(s, colMeans)

as.matrix(l.apply.out1)
#>            [,1]  
#> setosa     10.142
#> versicolor 14.292
#> virginica  17.14
as.matrix(l.apply.out2)
#>            [,1]     
#> setosa     Numeric,4
#> versicolor Numeric,4
#> virginica  Numeric,4

reprex package(v0.2.1)于2018-10-08创建

这就是您所遇到问题的根源。我在这里发现有趣的是,在似乎与您真正想要的相反的情况下,您完全使用了lapply()sapply()可以轻松地为您提供:

(s.apply.out1 <- sapply(s, function(x) {sum(colMeans(x))}))
#>     setosa versicolor  virginica 
#>     10.142     14.292     17.140
(s.apply.out2 <- sapply(s, colMeans))
#>              setosa versicolor virginica
#> Sepal.Length  5.006      5.936     6.588
#> Sepal.Width   3.428      2.770     2.974
#> Petal.Length  1.462      4.260     5.552
#> Petal.Width   0.246      1.326     2.026

rbind(s.apply.out1, s.apply.out2) %*% matrix(1,3,1)
#>                [,1]
#> s.apply.out1 41.574
#> Sepal.Length 17.530
#> Sepal.Width   9.172
#> Petal.Length 11.274
#> Petal.Width   3.598

reprex package(v0.2.1)于2018-10-08创建