我有3个向量A,B,C。它们的行数均相同。我正在寻找的是向量求和的所有可能组合。对于此示例,我想要A + B,A + C,B + C和A + B + C。 R中是否有任何命令/软件包可以做到这一点?换句话说,我希望线性系数为1的3个向量的所有可能线性组合。我的真正问题是涉及很多向量,而不仅仅是3个。
谢谢
答案 0 :(得分:2)
一个选择是将向量放置在combn
中后的list
,然后从2循环到length
的{{1}}并将list
应用于{{ 1}}并获得combn
list
为了提高效率,还可以使用colSums
中的lst1 <- list(A, B, C)
lapply(2:length(lst1), function(i) do.call(rbind, combn(lst1, i,
function(x) Reduce(`+`, x), simplify = FALSE)))
comb_n
答案 1 :(得分:1)
假设我们有以下三个向量x
,y
和z
set.seed(20191206)
(x <- runif(10))
## [1] 0.6735252 0.3566995 0.3849840 0.5937276 0.8116468 0.5734249 0.7149757 0.1567160 0.1757700 0.7636036
(y <- runif(10))
## [1] 0.2748723077 0.4907480855 0.0004572209 0.5516090256 0.2216921777 0.8455295560 0.4692991707 0.3110730459 0.2288788261
## [10] 0.3893694628
(z <- runif(10))
## [1] 0.91941434 0.85875047 0.82157849 0.69223918 0.84506022 0.14031886 0.65145257 0.34698708 0.02684135 0.14984516
通过应用以下代码,我们得到了
apply(matrix(c(x, y, z), ncol=3), 1, function(x){unlist(lapply(c(1:3), function(y){combn(x, y, sum)}))})
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 0.6735252 0.3566995 0.3849839806 0.5937276 0.8116468 0.5734249 0.7149757 0.1567160 0.17577005 0.7636036
## [2,] 0.2748723 0.4907481 0.0004572209 0.5516090 0.2216922 0.8455296 0.4692992 0.3110730 0.22887883 0.3893695
## [3,] 0.9194143 0.8587505 0.8215784931 0.6922392 0.8450602 0.1403189 0.6514526 0.3469871 0.02684135 0.1498452
## [4,] 0.9483975 0.8474476 0.3854412015 1.1453367 1.0333390 1.4189544 1.1842749 0.4677890 0.40464887 1.1529731
## [5,] 1.5929395 1.2154500 1.2065624737 1.2859668 1.6567070 0.7137437 1.3664283 0.5037031 0.20261140 0.9134488
## [6,] 1.1942866 1.3494986 0.8220357141 1.2438482 1.0667524 0.9858484 1.1207517 0.6580601 0.25572018 0.5392146
## [7,] 1.8678118 1.7061981 1.2070196946 1.8375758 1.8783992 1.5592733 1.8357275 0.8147761 0.43149023 1.3028182
其中
您现在可以将上面的示例推广到您的特定问题。
希望此代码段对您有帮助!
答案 2 :(得分:1)
library(tidyverse)
a = 1:3
b = 4:6
c = 7:9
dat = data.frame(a, b, c)
sum.fnc = function(data, n) {
# Get combinations of columns to sum
sum.vars = combn(names(data), n, simplify=FALSE)
# Name the columns based on the vectors being summed
names(sum.vars) = map(sum.vars, ~paste(.x, collapse="."))
# Return the desired sums
map(sum.vars, ~rowSums(data[ , .x]))
}
all.sums = map(2:length(dat), ~sum.fnc(dat, .x)) %>% flatten
all.sums
$a.b [1] 5 7 9 $a.c [1] 8 10 12 $b.c [1] 11 13 15 $a.b.c [1] 12 15 18
as.data.frame(all.sums)
a.b a.c b.c a.b.c 1 5 8 11 12 2 7 10 13 15 3 9 12 15 18