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