数据框列的组合和排列

时间:2017-09-01 14:50:45

标签: r algorithm combinations permutation combinatorics

我需要一些帮助来计算数据框列的所有组合和排列。 我的df看起来像这样(真正的有40多列和15000多行)

ID      A   B   C   D
ID_1    NA  1   NA  1
ID_2    1   1   1   1
ID_3    1   1   1   1
ID_4    NA  1   1   NA
ID_5    1   1   1   1
ID_6    1   NA  NA  1
ID_7    1   1   1   1
ID_8    1   NA  NA  NA
ID_9    1   1   1   1
ID_10   1   1   1   1
ID_11   1   1   1   1
ID_12   NA  NA  1   1
ID_13   NA  NA  1   NA
ID_14   1   1   1   NA

第一列包含唯一ID,第2列:40+包含1(当前)或NA(缺席)。

现在我需要知道有多少ID出现在'对于每种组合和排列 AB,AC,AD,BC ..... ABC,ABD ..... ABCDE,ABCDF ....等等。

使用combinat我可以通过

轻松检索所有可能的组合/排列(假设有4列数据帧)
for (i in 1:3){
  combn(4, i)
next}

但是,我怎样才能用它来计算我需要的东西并在像

这样的数据框中得到结果
1   2   3   4
A   AB  ABC ABCD
B   AC  ABD na
C   AD  ACD na
D   BC  BCD na
na  BD  na  na
na  CD  na  na

1 个答案:

答案 0 :(得分:0)

好吧,我认为我找到了解决这个问题的方法,但它速度非常慢(在20列和18000行的数据集上大于12小时),所以欢迎任何改进建议。

假设一个初始数据表,其中“ID”列已被删除,并且看起来像这样

A   B   C   D   E   F   G   H
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   NA
1   1   1   1   1   1   1   1
1   1   1   1   1   NA  NA  NA
1   1   NA  1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   NA
NA  1   1   NA  1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   NA  1
NA  1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   NA  1   1   1
1   1   1   1   1   1   1   1
1   1   NA  NA  1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   NA  1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   NA
1   1   1   1   1   1   1   1
NA  1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   NA  1   1
1   1   1   1   1   1   1   1
1   NA  NA  1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   NA  1
1   1   1   1   NA  1   NA  1
1   1   NA  1   1   1   NA  1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   NA
1   1   1   1   1   1   1   NA
1   1   1   NA  1   1   1   NA
1   1   1   1   1   1   1   1
NA  NA  NA  NA  NA  NA  NA  1

我首先使用combn以这种方式计算所有可能的组合

combi <- as.data.frame(t(colnames(dt)))

for (i in 2:ncol(dt)){
  combi <- cbind.fill(combi, as.data.frame(combn(colnames(dt), i)),  fill = NA)
next}

然后我为最终结果创建一个表

final <- data.frame(group = apply(combi, 2 , function(x) length(which(x != "" ))) , value = c(NA))

最后,我计算每个组合中存在的ID数量

for (i in 1:ncol(combi)){
  final[i, 2] <- nrow(dt[ , c(which(colnames(dt) %in% c(as.character(na.omit(combi[, i]))))), with = FALSE][!apply(dt[ , c(which(colnames(dt) %in% c(as.character(na.omit(combi[, i]))))), with = FALSE] == "", 1, all),])
next}

要获得最终结果,我希望我这样做

result <- subset(final, group == 1)[,2]
for (i in 2:max(final[, 1])){
  result <- cbind.fill(result, subset(final, group == i)[,2],  fill = NA)
next}

组合表combi的生成和final上的计算是瓶颈,它适用于小数据,但正如我所说,即使在大数据集上它也非常慢踢屁股机器。