R-在向量中添加元素的组合

R-在向量中添加元素的组合,r,vector,R,Vector,有人知道一种在向量中把数的组合相加的方法吗 假设我通过一个for循环,每次我得到一个不同长度的向量,我如何组合这个向量的每个元素,使我得到2,3,等等元素的和 例如,如果我有: vector <- c(1:5) 而且: element 1 + element 2 + element 3 我该怎么做?需要注意的是,在许多向量中,长度是不同的。因此,一个向量可能包含3个元素,另一个向量可能包含12个元素 我知道你可以做向量[1]+向量[2],但是我需要一些方法来迭代整个向量,其中考虑到了上

有人知道一种在向量中把数的组合相加的方法吗

假设我通过一个for循环,每次我得到一个不同长度的向量,我如何组合这个向量的每个元素,使我得到2,3,等等元素的和

例如,如果我有:

vector <- c(1:5)
而且:

element 1 + element 2 + element 3
我该怎么做?需要注意的是,在许多向量中,长度是不同的。因此,一个向量可能包含3个元素,另一个向量可能包含12个元素


我知道你可以做
向量[1]+向量[2]
,但是我需要一些方法来迭代整个向量,其中考虑到了上面的注释。

使用你可以使用
combn

> combn(vector, 3, FUN = NULL, simplify = TRUE)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    1    1    2    2    2     3
[2,]    2    2    2    3    3    4    3    3    4     4
[3,]    3    4    5    4    5    5    4    5    5     5
这里的技巧是,每个调用都将返回一个结果矩阵,您必须决定如何聚合和存储所有不同的组合

如果您不介意列出一个列表,那么下面应该可以做到这一点:

> sapply(c(1:length(vector)),
         function(x) {
             combn(vector, x, FUN = NULL, simplify = TRUE)
         })

使用您可以使用
combn

> combn(vector, 3, FUN = NULL, simplify = TRUE)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    1    1    1    1    2    2    2     3
[2,]    2    2    2    3    3    4    3    3    4     4
[3,]    3    4    5    4    5    5    4    5    5     5
这里的技巧是,每个调用都将返回一个结果矩阵,您必须决定如何聚合和存储所有不同的组合

如果您不介意列出一个列表,那么下面应该可以做到这一点:

> sapply(c(1:length(vector)),
         function(x) {
             combn(vector, x, FUN = NULL, simplify = TRUE)
         })
生成对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
 [1] 3 4 5 6 5 6 7 7 8 9
子集\u求和

     [,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
 [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\u subset\u sum()
中的
return()
之前添加以下内容:

对多个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)
}
生成对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
 [1] 3 4 5 6 5 6 7 7 8 9
子集\u求和

     [,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
 [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\u subset\u sum()
中的
return()
之前添加以下内容:

对多个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)
}

您可能正在从
zoo
包中查找
rollsum
,您可以在其中指定要添加的元素数:

lapply(2:5, function(i) zoo::rollsum(1:5, i))
[[1]]
[1] 3 5 7 9    # two elements roll sum

[[2]]
[1]  6  9 12   # three elements roll sum

[[3]]
[1] 10 14      # four elements roll sum

[[4]]
[1] 15         # five elements roll sum

您可能正在从
zoo
包中查找
rollsum
,您可以在其中指定要添加的元素数:

lapply(2:5, function(i) zoo::rollsum(1:5, i))
[[1]]
[1] 3 5 7 9    # two elements roll sum

[[2]]
[1]  6  9 12   # three elements roll sum

[[3]]
[1] 10 14      # four elements roll sum

[[4]]
[1] 15         # five elements roll sum

以下内容依赖于数字的二进制表示。基本上,您需要检查2^n个组合。通过将1到2^n之间的任何数字写入具有“n”位的二进制文件,就可以获得所需元素的所有排列

number2binary
函数来源于Paul Hiestra在以下章节中的答案:

number2binary=函数(数字,noBits){
二进制向量=rev(作为数值(整数位(数字)))
如果(缺少(没有){
返回(二进制向量)
}否则{
二进制_向量[-(1:(长度(二进制_向量)-noBits))]
}
}

向量以下依赖于数字的二进制表示。基本上,您需要检查2^n个组合。通过将1到2^n之间的任何数字写入具有“n”位的二进制文件,就可以获得所需元素的所有排列

number2binary
函数来源于Paul Hiestra在以下章节中的答案:

number2binary=函数(数字,noBits){
二进制向量=rev(作为数值(整数位(数字)))
如果(缺少(没有){
返回(二进制向量)
}否则{
二进制_向量[-(1:(长度(二进制_向量)-noBits))]
}
}

向量你好。我真的不明白你的答案。在我问题中的示例中,最大可能值为15(5+4+3+2+1),但当我运行代码时,我得到一些高达40的值。我只需要用某种方法将向量中所有不同的元素组合相加,但是在for循环中,向量有x个元素。也许我误解了吗?考虑<代码> C(5,3)<代码> >代码>选择(5,3)< /代码>,这给出了总共10的组合。因此,对于这些组合中的每一个