У меня есть фрейм данных со столбцами n
, и я хочу применить функцию к каждой комбинации столбцов.Это очень похоже на то, как функция cor()
принимает кадр данных в качестве входных данных и создает матрицу корреляции в качестве выходных данных, например:
X <- data.frame(A=rnorm(100), B=rnorm(100), C=rnorm(100))
cor(X)
, которая будет генерировать эти выходные данные:
> cor(X)
A B C
A 1.00000000 -0.01199511 0.02337429
B -0.01199511 1.00000000 0.07918920
C 0.02337429 0.07918920 1.00000000
Однако у меня есть пользовательская функция, которую нужно применить к каждой комбинации столбцов.Сейчас я использую решение, которое использует вложенные для циклов, которое работает:
f <- function(x, y) sum((x+y)^2) # some placeholder function
out <- matrix(NA, ncol = ncol(X), nrow = ncol(X)) # pre-allocate
for(i in seq_along(X)) {
for(j in seq_along(X)) {
out[i, j] <- f(X[, i], X[, j]) # apply f() to each combination
}
}
, которое производит:
> out
[,1] [,2] [,3]
[1,] 422.4447 207.0833 211.4198
[2,] 207.0833 409.1242 218.2430
[3,] 211.4198 218.2430 397.5321
В настоящее время я пытаюсь перейти в Tidyverse и будетпредпочитают избегать использования для петель. Может ли кто-нибудь показать мне аккуратное решение для этой ситуации? Спасибо!