我需要一些帮助来计算数据框列的所有组合和排列。
我的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
我可以通过
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
答案 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
上的计算是瓶颈,它适用于小数据,但正如我所说,即使在大数据集上它也非常慢踢屁股机器。