gpt4 book ai didi

r - 数据框列的组合和排列

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:08 24 4
gpt4 key购买 nike

我需要一些帮助来计算数据框列的所有组合和排列。我的 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(不存在)。

现在我需要知道每个组合和排列“存在”多少个 IDAB, 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

最佳答案

好吧,我想我找到了解决这个问题的方法,但速度非常慢(在 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 的计算是瓶颈,它适用于小数据,但正如我所说,它非常慢大数据集,即使是在一台牛逼的机器上也是如此。

关于r - 数据框列的组合和排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46002876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com