Несоответствующие аргументы при использовании apply - PullRequest
0 голосов
/ 16 марта 2020

У меня есть таблица данных 10000 x 7 дата . Я хотел бы умножить каждый ряд данных на матрицу 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.

Как мне сделать эта работа с применением?

Спасибо!

Дополнительная информация - я мог бы добиться того, что мне нужно, другим способом. Я мог бы умножить весь data.frame на матрицу и взять sqrt(diag(x)). Однако мне нужно делать это много раз, поэтому было бы эффективнее брать этот ряд за строкой и возвращать одну цифру.

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Я думаю, вам следует использовать t(as.matrix(x))%*% as.matrix(c) %*% as.matrix(x) в вашей функции apply, поскольку аргумент 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
0 голосов
/ 17 марта 2020

Примечание: 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))))

Оба решения дают одинаковые результаты.

...