R 创建序列的组合

R 创建序列的组合,r,R,我试图解决以下问题: 考虑5个简单的序列:0:100,100:0,rep(0101),rep(50101),rep(100101) 我需要3个数值变量的集合,它们在所有组合中都有上述序列。由于有5个序列和3个变量,因此可以有5*5*5个组合,因此每个变量中总共有12625(5*5*5*101)个数字(每个序列101个) 这些可以分组在一个12625行和4列的data.frame中。第一列(V)将只包含seq(1:12625)(可以使用行号代替它)。其他3列(A、B、C)将以不同的组合具有5个以上

我试图解决以下问题:

考虑5个简单的序列:0:100,100:0,rep(0101),rep(50101),rep(100101)

我需要3个数值变量的集合,它们在所有组合中都有上述序列。由于有5个序列和3个变量,因此可以有5*5*5个组合,因此每个变量中总共有12625(5*5*5*101)个数字(每个序列101个)

这些可以分组在一个12625行和4列的data.frame中。第一列(V)将只包含seq(1:12625)(可以使用行号代替它)。其他3列(A、B、C)将以不同的组合具有5个以上的序列。例如,前101行在所有3个A、B和C中为0:100。接下来的101行在A和B中为0:100,在C中为100:0。依此类推

我可以创建以下序列:

s = list()
s[[1]] = 0:100
s[[2]] = 100:0
s[[3]] = rep(0,101)
s[[4]] = rep(50,101)
s[[5]] = rep(100,101)
但如何进一步?我并不真正需要数据帧,但我需要一个函数,它返回一个列表,其中包含发送给它的数字(第一列或第五列)的c(a,B,c)值。这个数字显然可以从1到12625不等


如何创建这样的函数。我更喜欢矢量解决方案或使用apply族函数优化速度的解决方案。

我想出了两个解决方案。我发现这很难用
apply
之类的东西来解决,因为它们的输出往往不太好处理(也许有人比我更能“驯服”它们:D)

第一个解决方案使用对
lappy
的单独调用,第二个解决方案使用
for
循环和一些编程No。就我个人而言,我更喜欢第二个,第一个更快,虽然

grd <- expand.grid(a=1:5,b=1:5,c=1:5)

# apply-ish
A <- lapply(grd[,1], function(z){ s[[z]] })
B <- lapply(grd[,2], function(z){ s[[z]] })
C <- lapply(grd[,3], function(z){ s[[z]] })
dfr <- data.frame(A=do.call(c,A), B=do.call(c,B), C=do.call(c,C))

# for-ish
mat <- NULL
for(i in 1:nrow(grd)){
 cur <- grd[i,]
 tmp <- cbind(s[[cur[,1]]],s[[cur[,2]]],s[[cur[,3]]])
 mat <- rbind(mat,tmp)
}

grd您要求一个矢量化解决方案,因此这里有一个仅使用
数据的解决方案。表
(类似于@SimonGs方法)

库(data.table)
grd
library(data.table)
grd <- CJ(A = seq_len(5), B = seq_len(5), C = seq_len(5))
res <- grd[, lapply(.SD, function(x) unlist(s[x]))]
res
#          A   B   C
#     1:   0   0   0
#     2:   1   1   1
#     3:   2   2   2
#     4:   3   3   3
#     5:   4   4   4
#  ---            
# 12621: 100 100 100
# 12622: 100 100 100
# 12623: 100 100 100
# 12624: 100 100 100
# 12625: 100 100 100