将多个序列中的元素总和折叠成有序列表R.

时间:2013-04-17 19:02:07

标签: r sequence

设r = c(0,1,2),s = c(0,5,10)。我想要一个可以带r和s的函数(最终将需要两个以上的序列 - 如果可能的话我想避免循环!),并返回r和s中元素总和的所有唯一组合的有序列表,即返回以下内容:

0,1,2,5,6,7,10,11,12

谢谢!

2 个答案:

答案 0 :(得分:4)

您可以将功能expand.grid()rowSums()结合起来。 expand.grid()将生成所有组合的数据框,rowSums()将计算这些组合的总和。

r = c(0,1,2)
s = c(0,5,10)
rowSums(expand.grid(r,s))
[1]  0  1  2  5  6  7 10 11 12

使用函数sort(),您可以对值进行排序。

r = c(0,1,2)
s = c(0,5,10)
k=c(3,4,6)
rowSums(expand.grid(r,s,k))
 [1]  3  4  5  8  9 10 13 14 15  4  5  6  9 10 11 14 15 16  6  7  8 11 12 13 16 17 18
sort(rowSums(expand.grid(r,s,k)))
 [1]  3  4  4  5  5  6  6  7  8  8  9  9 10 10 11 11 12 13 13 14 14 15 15 16 16 17 18

答案 1 :(得分:1)

与@Didzis类似的概念,但使用outer代替Reduce

as.vector(Reduce(function(x, y) outer(x, y, '+'), list(r, s, k)))
#  [1]  3  4  5  8  9 10 13 14 15  4  5  6  9 10 11 14 15 16  6  7  8 11 12 13 16 17 18
如果需要,

sort包装。


小型基准测试:

w <- sample(50)
x <- sample(50)
y <- sample(50)
z <- sample(30)

# arun's 
system.time(t1 <- as.vector(Reduce(function(x, y) outer(x, y, '+'), list(w, x, y, z))))
#    user  system elapsed 
#   0.051   0.044   0.100 

# Didzis'
system.time(t2 <- rowSums(expand.grid(w, x, y, z)))
#    user  system elapsed 
#   1.167   0.308   1.579 

identical(as.numeric(t1), t2)
[1] TRUE