【发布时间】:2020-12-17 04:25:04
【问题描述】:
我有一个大型数据框,它的主要组织是一行,其中包含长度相同的组(在玩具示例 3 中)。
df <- data.frame(groups = c("gr1","gr1","gr1","gr2","gr2","gr2","gr3","gr3","gr3"),
no = c(1, 2, 3, 1, 2, 3, 1, 2, 3),
colA = c("a", "b", "c", "a", "b", "c", "a", "b", "c"),
colB = c("a", "b", "c", "X_", "b", "c", "a", "b", "c"),
colC = c("a", "b", "c", "X_", "b", "c", "c", "b", "a"))
df
> df
> groups no colA colB colC
> 1 gr1 1 a a a
> 2 gr1 2 b b b
> 3 gr1 3 c c c
> 4 gr2 1 a X_ X_
> 5 gr2 2 b b b
> 6 gr2 3 c c c
> 7 gr3 1 a a c
> 8 gr3 2 b b b
> 9 gr3 3 c c a
我想为每一列确定哪个组是唯一值排列的第一个示例。所以对于 colA 它应该返回 (T, F, F) 因为所有三个组都是相同的,所以只有第一组是第一个唯一的。对于 colB 它应该返回 (T, T, F) 因为有两个不同的组并且只有第 3 个与第 1 个相同。对于 colC,它应该是 (T, T, T),因为项目的顺序很重要。
所以最终的输出可能是这样的矩阵
colA colB colC
> gr1 T T T
> gr2 F T T
> gr3 F F T
我想我可以通过将数据框分解成组和 colA/B/B 对来解决这个问题,确定哪些是相同的,将结果存储在一个向量中,然后重新组装整个交易。但是我看到了大量的 for 循环,并且很难考虑如何对其进行矢量化。我一直在使用 dplyr,但我还没有看到它有什么帮助。
也许有一种不错的方法可以根据组取消堆叠每个列,然后对新(和更短)列的相关子集进行比较?
编辑添加:
也许 group_by %>% summarise 是解决这个问题的一种方法。如果摘要基本上可以将每列组中的所有值连接成一个非常长的字符串,那么我可以看到每个组中哪些是不同的?
第二次编辑:
我做到了:
d1 <- df %>% group_by(groups) %>% summarise(colB = paste(unique(colB), collapse = ', ')) %>% distinct(colB)
放出来
> # A tibble: 2 x 1
> colB
> <chr>
> 1 a, b, c
> 2 X_, b, c
它标识了不同的组,但我现在必须弄清楚如何将它与其余的完整列进行比较以获得每个组的 T/F。
【问题讨论】:
-
很棒的收获。谢谢。