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