将 R 中矩阵的所有组合加在一起,以便稍后调用名称

Ros*_*ust 2 combinations r matrix

我有几个计数变量矩阵,我们可以表示如下:

P <- matrix(c(1, 2 ,0, 2, 5, 1, 0, 6, 1), nrow = 3)
Q <- matrix(c(1, 0, 0, 2, 3, 1, 0, 4, 1), nrow = 3)
R <- matrix(c(2, 1, 1, 5, 6, 4, 0, 4, 1), nrow = 3)
S <- matrix(c(9, 7, 5, 4, 7, 3, 2, 6, 3), nrow = 3)
Run Code Online (Sandbox Code Playgroud)

我想创建将这些矩阵相加的所有组合。例如。P+Q、P+R、P+S、Q+R、Q+S、R+S、P+Q+R、P+R+S、P+Q+S、Q+R+S...

我知道如何手动运行它:

PQ <-P+Q

> PQ
     [,1] [,2] [,3]
[1,]    2    4    0
[2,]    2    8   10
[3,]    0    2    2

PQR <- P+Q+R

> PQR
     [,1] [,2] [,3]
[1,]    4    9    0
[2,]    3   14   14
[3,]    1    6    3
Run Code Online (Sandbox Code Playgroud)

但我的真实数据集有 9 个矩阵,这意味着 501 个组合,这需要很长时间才能写出来。

所以我尝试了这个:

# generate all possible combinations of the matrices
combs <- combn(list(P, Q, R, S), 2, simplify = FALSE)

print(combs)

# sum the matrices in each combination
sums <- lapply(combs, function(x) Reduce("+", x))


# print the result
print(sums)
Run Code Online (Sandbox Code Playgroud)

一方面,似乎确实可以进行所有组合。但它不允许我知道哪个组合是哪个。

如何将所有矩阵添加在一起并确保名称反映了正在添加的矩阵,以便我以后可以调用它们?

G. *_*eck 5

1)创建一个命名列表,首先计算总和,然后添加名称。

L <- list(P = P, Q = Q, R = R, S = S)

make_sums <- function(x, n) {
  y <- combn(x, n, Reduce, f = `+`, simplify = FALSE)
  names(y) <- combn(names(x), n, paste, collapse = "+")
  y
}

Sums <- c( make_sums(L, 2), make_sums(L, 3) )
Run Code Online (Sandbox Code Playgroud)

2)另一种可能性是使用列表推导式。 L是从上面来的。第一个参数gen.named.list定义名称,第二个参数定义值。

library(listcompr)

Sums2 <- gen.named.list("{i}+{j}", L[[i]] + L[[j]],
  i = names(L), j = names(L), i < j)

Sums3 <- gen.named.list("{i}+{j}+{k}", L[[i]] + L[[j]] + L[[k]], 
  i = names(L), j = names(L), k = names(L), i < j, j < k)

Sums <- c(Sums2, Sums3)
Run Code Online (Sandbox Code Playgroud)