我需要接收从原始数据帧拆分为3列的所有可能组合的所有可能数据帧。并且所有数据帧都必须包含id列。我处于死路,不知道如何保存所有可能的数据帧,以便能够进一步完成所有这些数据帧。其中一个想法是将它们保存到列表中。但我仍然不知道如何将所有必要的列绑定在一起。我找到了我的近距离question,但它仍然非常不同。除了原始数据帧有超过1百万行和大约20列,因此使用data.table是合理的。
frame <- data.frame(id = letters[seq( from = 1, to = 10 )],
a = rnorm(10, 4), b = rnorm(10, 6), c=rnorm(10, 5),
d = rnorm(10, 2))
combos <- data.table(combn(colnames(frame[,-1]), 3))
combos <- data.table(t(rbind(combos, t(rep(colnames(output2[,1]), ncol(combos))))))
names(combos) <- c('category_1', 'category_2', 'category_3', 'id')
list_tables <- apply(combos, 1, as.list)
伙计们,我将不胜感激任何帮助。提前致谢
答案 0 :(得分:0)
请参阅您的OP样本数据和预期输出的评论。除此之外,也许你可以做这样的事情?
lapply(as.data.frame(combn(ncol(frame) - 1, 3)), function(idx)
frame[, c(1, idx + 1)])
#$V1
# id a b c
#1 a 5.434201 6.342768 5.140709
#2 b 3.922708 7.572425 4.147767
#3 c 4.739137 5.253265 6.903397
#4 d 2.241395 6.306650 3.351814
#5 e 3.930175 4.569514 5.759625
#6 f 4.451906 7.194427 5.062291
#7 g 2.041634 5.517932 4.610969
#8 h 3.998476 7.317862 5.636666
#9 i 3.734664 4.870168 4.132215
#10 j 5.563223 5.073649 5.098734
#
#$V2
# id a b d
#1 a 5.434201 6.342768 1.3168256
#2 b 3.922708 7.572425 2.2410894
#3 c 4.739137 5.253265 2.5894319
#4 d 2.241395 6.306650 1.0693751
#5 e 3.930175 4.569514 2.2974619
#6 f 4.451906 7.194427 5.1372771
#7 g 2.041634 5.517932 0.9724653
#8 h 3.998476 7.317862 3.9418028
#9 i 3.734664 4.870168 1.7220438
#10 j 5.563223 5.073649 1.7784112
#
#$V3
# id a c d
#1 a 5.434201 5.140709 1.3168256
#2 b 3.922708 4.147767 2.2410894
#3 c 4.739137 6.903397 2.5894319
#4 d 2.241395 3.351814 1.0693751
#5 e 3.930175 5.759625 2.2974619
#6 f 4.451906 5.062291 5.1372771
#7 g 2.041634 4.610969 0.9724653
#8 h 3.998476 5.636666 3.9418028
#9 i 3.734664 4.132215 1.7220438
#10 j 5.563223 5.098734 1.7784112
#
#$V4
# id b c d
#1 a 6.342768 5.140709 1.3168256
#2 b 7.572425 4.147767 2.2410894
#3 c 5.253265 6.903397 2.5894319
#4 d 6.306650 3.351814 1.0693751
#5 e 4.569514 5.759625 2.2974619
#6 f 7.194427 5.062291 5.1372771
#7 g 5.517932 4.610969 0.9724653
#8 h 7.317862 5.636666 3.9418028
#9 i 4.870168 4.132215 1.7220438
#10 j 5.073649 5.098734 1.7784112
set.seed(2017);
frame <- data.frame(id = letters[seq( from = 1, to = 10 )],
a = rnorm(10, 4), b = rnorm(10, 6), c=rnorm(10, 5),
d = rnorm(10, 2))
最好总是在提供随机样本数据时使用固定种子。
答案 1 :(得分:0)
我建议不将所有数据生成到列表中。只需生成列名称组合矩阵(就像您正在做的那样)并一次一个地使用它们:
combos = combn(colnames(frame[,-1]), 3)
combos = rbind("id", combos)
然后,您只需按i
combos
列frame
对# first combo
frame[combos[, 1]]
# hundred and third combo
frame[combos[, 103]]
# etc.
进行分组。
frame
最好让data.table
成为combos
,但将float
作为矩阵保持更简单,效率更高。