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个以上的序列。例如,前101行在所有3个A、B和C中为0:100。接下来的101行在A和B中为0:100,在C中为100:0。依此类推 我可以创建以下序列: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个以上
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