生成对 ID
在这种情况下,我们需要得到对:
combn(3, 2)
输出:
[,1] [,2] [,3]
[1,] 1 1 2
[2,] 2 3 3
对是按列生成的。
对向量元素求和(使用子集)
为了访问每个元素并执行求和,我们选择定义一个辅助函数来获取组合和向量。
# Write a helper function
# sums of the index of the vector
comb_subset_sum = function(x, vec){
return(sum(vec[x]))
}
由此,我们可以直接使用combn,也可以使用sapply。
求和为 1 k:
combn直接:
# Input Vector
vec = 1:5
# Length of vector
n = length(vec)
# Generate pairwise combinations and obtain pair_sum
# Specify the k (m in R)
m = combn(n, m = 2, FUN = comb_subset_sum, vec = vec)
sapply 用法:
# Input Vector
vec = 1:5
# Number of Observations
n = length(vec)
# Combinations
# Specify the k (m in R)
combinations = combn(n, m = 2)
# Obtain vectorized sum over subset
subset_summed = apply(combinations, 2, comb_subset_sum, vec = vec)
示例输出:
组合:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 1 1 2 2 2 3 3 4
[2,] 2 3 4 5 3 4 5 4 5 5
subset_summed:
[1] 3 4 5 6 5 6 7 7 8 9
追踪:
vec[1]+vec[2]=3
vec[1]+vec[3]=4
vec[1]+vec[4]=5
vec[1]+vec[5]=6
vec[2]+vec[3]=5
vec[2]+vec[4]=6
vec[2]+vec[5]=7
vec[3]+vec[4]=7
vec[3]+vec[5]=8
vec[4]+vec[5]=9
要获取跟踪输出,请在comb_subset_sum() 中的return() 之前添加以下内容:
cat(paste0("vec[",x,"]", collapse = "+"), "=", sum(vec[x]), "\n")
对多个k求和:
在这里,我们应用相同的逻辑,只是以使组合的 k 值能够取多个值的方式。
# Input Vector
vec = 1:5
# Length of Vec
n = length(vec)
# Store output
o = vector('list',n)
for(i in seq_along(vec)){
o[[i]] = combn(n, i, FUN = comb_subset_sum, vec = vec)
}
注意:o的每个元素的大小会随着组合数量的增加然后减少而变化。
对组合求和
如果我们不关心向量元素的值,我们可以用类似于我们获取向量元素的方式对实际组合进行求和。
要生成对然后求和,请使用:
# Input Vector
vec = 1:5
# Length of Vec
n = length(vec)
# Generate all combinations (by column)
# Specify the k (m in R)
m = combn(n, m = 2)
# Obtain sum by going over columns
sum_m = apply(m, 2, sum)
或者一次性完成:
# Specify the k (m in R)
sum_inplace = combn(n, m = 2, FUN = sum)
平等:
all.equal(sum_m,sum_inplace)
k 使用次数的总和
而且,和以前一样,我们可以设置它以获取不同 k 下的所有总和,方法是:
# Input Vector
vec = 1:5
# Length of Vec
n = length(vec)
# Store output (varying lengths)
o = vector('list',n)
for(i in seq_along(vec)){
o[[i]] = combn(n, i, FUN = sum)
}