将数据帧拆分为R中3列的所有可能的数据帧组合

时间:2018-05-30 22:11:39

标签: r dataframe split multiple-columns combn

我需要接收从原始数据帧拆分为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)

伙计们,我将不胜感激任何帮助。提前致谢

2 个答案:

答案 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 combosframe# first combo frame[combos[, 1]] # hundred and third combo frame[combos[, 103]] # etc. 进行分组。

frame

最好让data.table成为combos,但将float作为矩阵保持更简单,效率更高。