令 r = c(0,1,2) 和 s = c(0,5,10)。我想要一个可以采用 r 和 s 的函数(最终将采用两个以上的序列 - 如果可能,我想避免循环!),并返回 r 和 s 中元素总和的所有唯一组合的有序列表,即返回以下:
0,1,2,5,6,7,10,11,12
谢谢!
您可以将函数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
与@Didzis 类似的概念,但使用outer
withReduce
代替:
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