【发布时间】:2018-05-03 10:51:29
【问题描述】:
我有一个数据集,其中不同的行具有不同的元素组合,我想提取具有相同元素组合的行组。对于这个示例数据集:
id <- c("A", "B", "C", "D")
X1 <- c(NA,NA,NA,"X1")
X2 <- c(NA,NA,"X2","X2")
X3 <- c("X3","X3","X3","X3")
X4 <- c("X4", "X4", "X4", "X4")
df <- data.frame(id,X1,X2,X3,X4)
> df
id X1 X2 X3 X4
1 A <NA> <NA> X3 X4
2 B <NA> <NA> X3 X4
3 C <NA> X2 X3 X4
4 D X1 X2 X3 X4
我希望能够退出
- 哪些 id 具有 X1 & X2 & X3 & X4 (D)
- 哪些 id 有 !X1 & X2 & X3 & X4 (C)
- 哪些 ID 具有 !X1 & !X2 & X3 & X4(A 和 B)。
我尝试将数据框拆分为列表并删除空单元格,以便每个 id 在列表中获得自己的 data.frame:
df.list <- split(df, seq(nrow(df)))
dfComplete.list <- lapply(df.list, function(remNA) remNA[,colSums(is.na(remNA)) < nrow(remNA)])
这让我有了
> dfComplete.list
$`1`
id X3 X4
1 1 X3 X4
$`2`
id X3 X4
2 2 X3 X4
$`3`
id X2 X3 X4
3 3 X2 X3 X4
$`4`
id X1 X2 X3 X4
4 4 X1 X2 X3 X4
我不知道从这里去哪里。有没有办法根据它们共有的元素/列对列表中的数据框进行分组?
我正在使用的真实数据集实际上包含 X7 到 X17 的元素/列,并且每个 id 都有 1 到 4 个元素,因此理想的解决方案将能够识别我的数据中存在的所有元素组合。
最后,我的数据最初是下面的长格式,然后我将其重新调整为上述格式,以防万一有一种更简单的方法可以从原始格式中找到解决方案:
id <- c("A", "A", "B", "B", "C", "C", "C", "D", "D", "D", "D")
elements <- c("X3", "X4", "X3", "X4", "X2", "X3", "X4", "X1", "X2", "X3", "X4")
dataLong <- data.frame(id, elements)
> dataLong
id elements
1 A X3
2 A X4
3 B X3
4 B X4
5 C X2
6 C X3
7 C X4
8 D X1
9 D X2
10 D X3
11 D X4
提前感谢您的帮助!
【问题讨论】: