Как передать столбцы матрицы в качестве параметров функции .apply? - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу передать несколько параметров одновременно функции, где эти параметры являются векторами, содержащимися в такой матрице:

> head(M, 3)
           [,1]      [,2]       [,3]
[1,]  1.3709584  1.304870 -0.3066386
[2,] -0.5646982  2.286645 -1.7813084
[3,]  0.3631284 -1.388861 -0.1719174

Например, с учетом cor() следующая строка дает мне то, что яхочу, но не хочу вложения.

> sapply(1:3, function(x) sapply(1:3, function(y, ...) cor(M[, x], M[, y])))
           [,1]       [,2]       [,3]
[1,]  1.0000000 -0.3749289  0.4400510
[2,] -0.3749289  1.0000000 -0.1533438
[3,]  0.4400510 -0.1533438  1.0000000

Я думал, что outer() будет кандидатом, поскольку:

> outer(1:3, 1:3, function(x, y) x + y)
     [,1] [,2] [,3]
[1,]    2    3    4
[2,]    3    4    5
[3,]    4    5    6

Но

corFun <- function(x, y) cor(M[, x], M[, y])
outer(1:3, 1:3, corFun)

не сработаетmapply(corFun, M[, 1], M[, 2]) попытки тоже не сработают.

Я хочу сделать xFun(corFun, M, arg) или даже лучше xFun(cor, M, arg), который дает (как указано выше):

           [,1]       [,2]       [,3]
[1,]  1.0000000 -0.3749289  0.4400510
[2,] -0.3749289  1.0000000 -0.1533438
[3,]  0.4400510 -0.1533438  1.0000000

, где arg <- combn(1:3, 2) или arg <- t(expand.grid(1:3, 1:3)).

Вообще мне интересно, существует ли существующая базовая функция R что-то вроде xFun(FUN, ..., arg), которая передает матрицу параметров arg с dim(arg)[1] == 2 по столбцам в функцию FUN = function(x, y) или, возможно, дажев более общем плане dim(arg)[1] == length(formals(FUN)).


Данные:

set.seed(42)
M <- matrix(rnorm(30), 10, 3)

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Другой вариант будет combn

combn(1:3, m = 3, FUN = corFun)[,, 1]
#           [,1]       [,2]       [,3]
#[1,]  1.0000000 -0.3749289  0.4400510
#[2,] -0.3749289  1.0000000 -0.1533438
#[3,]  0.4400510 -0.1533438  1.0000000

Результат, однако, является массивом, следовательно, [,, 1].

0 голосов
/ 11 февраля 2019

outer это ваша функция, но вам просто нужно Vectorize ваш corfun

outer(1:3, 1:3, Vectorize(corFun))
#           [,1]       [,2]       [,3]
#[1,]  1.0000000 -0.3749289  0.4400510
#[2,] -0.3749289  1.0000000 -0.1533438
#[3,]  0.4400510 -0.1533438  1.0000000
...