Ошибка «требует числовой / сложной матрицы / векторного аргумента», даже если аргументы являются матрицами - PullRequest
0 голосов
/ 08 октября 2018

Я писал некоторые функции для вычисления простой сводной статистики, когда обнаружил ошибку, которую не понимаю.По-видимому, я создаю объект класса matrix, который выдает ошибку, когда я пытаюсь использовать его в матричном умножении.Приведенное ниже MWE рассчитывает групповое среднее в наборе данных irisl.apply.out2) вместе с суммами компонентов каждого из групповых средних (в l.apply.out1).Два объекта затем связываются вместе в data.frame.

Теперь, я предполагаю, что я мог бы сделать дальнейшие вычисления, но преобразовав вышеупомянутый data.frame в матрицу, используя as.matrix, но код ниже дает ошибку 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 голосов
/ 08 октября 2018

Давайте посмотрим, что происходит, когда вы делаете 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

Создано в 2018-10-08 пакетом представлением (v0.2.1)

Вот источник вашей проблемы.Что мне здесь интересно, так это то, что вы вообще используете 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

Создано в 2018-10-08 пакетом Представление (v0.2.1)

...