2

我需要从原始数据帧拆分为所有可能的 3 列组合接收所有可能的数据帧。并且所有数据框都必须包含 id 列。我处于死胡同,不知道如何保存所有可能的数据帧,以便可以进一步使用它们。其中一个想法是将它们保存到列表中。但我仍然不知道如何将所有必要的列绑定在一起。我发现了一个与我很接近的问题,但它仍然非常不同。此外原始数据框有超过 100 万行和大约 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)

伙计们,我将不胜感激。提前致谢

4

2 回答 2

2

请查看对您的 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))

最好在提供随机样本数据时始终使用固定种子。

于 2018-05-30T22:18:38.340 回答
1

我建议不要将所有数据生成到列表中。只需生成一个列名组合矩阵(就像您正在做的那样)并一次使用它们:

combos = combn(colnames(frame[,-1]), 3)
combos = rbind("id", combos)

然后,您只需按需使用第ith 列combos进行子集化。frame

# first combo
frame[combos[, 1]]
# hundred and third combo
frame[combos[, 103]]
# etc.

frame拥有a会很好data.table,但保留combos为矩阵会更简单、更有效。

于 2018-05-30T22:25:29.017 回答