2

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

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

谢谢!

4

2 回答 2

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
于 2013-04-17T19:07:05.873 回答
1

与@Didzis 类似的概念,但使用outerwithReduce代替:

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如有必要,用 a 包裹它。


小基准测试:

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
于 2013-04-17T19:59:33.623 回答