错误“需要 numeric/complex matrix/vector 个参数”,即使参数是矩阵
Error “requires numeric/complex matrix/vector arguments”, even when arguments are matrices
我在写一些计算简单汇总统计的函数时,遇到了一个我不明白的错误。显然,我创建了一个 class 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)
无论如何,哪个显然更干净、更好,但我真的很想知道我的第一个示例中到底出了什么问题?
让我们看看当您这样做时会发生什么 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 创建
我在写一些计算简单汇总统计的函数时,遇到了一个我不明白的错误。显然,我创建了一个 class 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)
无论如何,哪个显然更干净、更好,但我真的很想知道我的第一个示例中到底出了什么问题?
让我们看看当您这样做时会发生什么 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 创建