R:从一个向量中,列出元素的所有子集,使它们的和只传递一个值

R:从一个向量中,列出元素的所有子集,使它们的和只传递一个值,r,constraints,subset,R,Constraints,Subset,如果答案(1)是琐碎的,请提前道歉;或者(2)在那里,但我无法解决这个问题,也无法在网上找到答案。任何指点都将不胜感激 我需要一段代码,它可以运行一个向量并返回其累积和超过阈值的所有可能元素子集 请注意,我不希望只得到准确给出阈值的子集。累积和可以高于阈值,只要算法停止添加额外的元素(如果已经达到该值) # A tiny example of the kind of input data. # However, note that efficiency is an issue # (I ne

如果答案(1)是琐碎的,请提前道歉;或者(2)在那里,但我无法解决这个问题,也无法在网上找到答案。任何指点都将不胜感激

我需要一段代码,它可以运行一个向量并返回其累积和超过阈值的所有可能元素子集

请注意,我不希望只得到准确给出阈值的子集。累积和可以高于阈值,只要算法停止添加额外的元素(如果已经达到该值)

# A tiny example of the kind of input data. 
# However, note that efficiency is an issue 
# (I need to replicate the example in a large dataset)
v <- seq(1, 3) # My vector
threshold <- 3 # My threshold value

# I would like to get a list with the combinations
# 1 2 
# 1 3
# 2 3
# 3 
#输入数据类型的一个小例子。
#但是,请注意,效率是一个问题
#(我需要在大型数据集中复制该示例)
v这可能是一种选择:

library(utils)
v <- seq (1,5)
v.len <- length(v)
threshold <- 3
for (count in seq(1,v.len))
{
  print(paste("subset length",count))
  combinations <- combn(v,count)
  out <- combinations[,apply(combinations, 2, sum)>=threshold]
  print (out)
}

因此,您需要对输出进行一些处理/决定将其存储在何处等。

我在有限的编码技能范围内找到了一个解决方案,它可能效率低下,但比编写无休止的循环更可行、更整洁

该函数的灵感来自于

recursive.subset=阈值){
cat(结果,x[i],“\n”,sep=“\t”)
}否则{
递归子集(x,i+1,current+x[i],阈值,c(result,x[i]))
}
}
}
要调用函数,只需

inivector <- vector(mode="numeric", length=0) #initializing empty vector
recursive.subset (v, 1, 0, threshold, inivector)

我认为你的要求不合适。如果(5)也是有效的并且是(2,5)的子集,那么(2,5)如何有效?也许你误用了单词“combines”,这意味着起始集的无序子集,而你真正想要的是原始有序向量的有序子序列。嗨,Ryan,我使用单词“combines”是为了说明顺序并不重要(这是说,我对得到[1,2]和[2,1]不感兴趣)。即使这是一个相对简单的问题,我也无法用语言表达。鉴于你的措辞更为恰当,我相应地重新编写了文本,谢谢!这样更好,但你的示例仍然不一致。你说顺序无关紧要,但你的示例暗示顺序确实重要。如果(5)是一个子集,其总和高于阈值3,那么算法如何有效地返回(2,5),这相当于(5,2)?您描述的算法基本上是顺序相关的(即“不断添加元素,直到达到阈值”),因此该算法的结果将取决于顺序。再次,您好。不确定这里的误解是什么。我说顺序不重要,因为我对a(2,5)和a(5,2)同样满意,只要我只得到一个答案。对不起,词汇量不准确…也许最好的解释方法是写下解决这个问题的错误方法…我会编辑我的帖子。我不确定你会对(2,5)或(5,2)中的任何一个满意,如果5本身已经超过阈值,而没有添加2。您编辑了示例,因此使用新示例,我不确定(1,3)、(2,3)、(3,2)或(3,1)中的任何一个是可接受的解决方案,因为它们都是另一个解决方案(3)的超集.如果你想将顺序视为不重要的,并且只希望最小子集至少达到阈值和,我认为只有(1,2)和(3)两个正确的解决方案。每一个达到阈值的集合都是这两个集合中的一个的超集。嗨,rbm,感谢您的输入…问题是您的代码为我提供了累积和高于阈值的所有子集,但该算法不满足我的第二个约束,即如果已经达到该值,它应该停止添加额外的元素。因此,t这里不应该有长度超过2的子集(即,两个数字的任何组合相加>=3)。我仍在努力解决这个问题……如果我得到答案,我会告诉你的!
[1] "subset length 1"
[1] 3 4 5
[1] "subset length 2"
     [,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] "subset length 3"
     [,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
[1] "subset length 4"
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    2
[2,]    2    2    2    3    3
[3,]    3    3    4    4    4
[4,]    4    5    5    5    5
[1] "subset length 5"
[1] 1 2 3 4 5
recursive.subset <-function(x, index, current, threshold, result){
  for (i in index:length(x)){
    if (current + x[i] >= threshold){
      cat (result, x[i], "\n",sep="\t") 
    } else {
      recursive.subset(x, i + 1, current+x[i], threshold, c(result,x[i]))
    }
  }
}
inivector <- vector(mode="numeric", length=0) #initializing empty vector
recursive.subset (v, 1, 0, threshold, inivector)