识别变量集具有相同值的观察组

Identify groups of observations with identical values for sets of variables

我有一个 data.frame 这样的:

example.df <- data.frame(grp = rep(1:3, each = 2),
                         attr.a = c(1, 4, 1, 7, 4, 1),
                         attr.b = c(2, 5, 2, 8, 5, 2),
                         attr.c = c(3, 6, 3, 9, 6, 3))

> example.df
  grp attr.a attr.b attr.c
1   1      1      2      3
2   1      4      5      6
3   2      1      2      3
4   2      7      8      9
5   3      4      5      6
6   3      1      2      3

我想确定是否有任何组 (grp) 包含 attr.aattr.battr.c 的相同观察集。在示例中,grp 1 & 3 包含相同的观察集(但是,观察集的排序方式不同)。同样在示例中,grp 2 仅包含一组与 grp 1 和 3 相同的观察值。只有当所有观察值集都相同时才应识别它。

如何识别相同的 grp 并不重要,只要清楚即可,但可能看起来像这样:

  grp attr.a attr.b attr.c ident
1   1      1      2      3     3
2   1      4      5      6     3
3   2      1      2      3     0
4   2      7      8      9     0
5   3      4      5      6     1
6   3      1      2      3     1

谢谢!

我们可以 unite 将 'attr' 列合并为单个列,按 'grp' 分组,sort 粘贴的元素创建单个字符串,使用 matchattr 上并按索引分组,rev 删除 'grp' 如果有多个元素,则与原始数据集进行连接

library(dplyr)
library(stringr)
library(tidyr)
example.df %>%
   unite(attr, starts_with('attr'), sep="") %>% 
   group_by(grp) %>% 
   summarise(attr = str_c(sort(attr), collapse = "")) %>%
   mutate(new = match(attr, unique(attr))) %>% 
   group_by(new) %>%
   mutate(ident = if(n() == 2) rev(grp) else 0) %>% 
   ungroup %>%
   select(-new, -attr) %>%
   left_join(example.df, .)

-输出

   grp attr.a attr.b attr.c ident
1   1      1      2      3     3
2   1      4      5      6     3
3   2      1      2      3     0
4   2      7      8      9     0
5   3      4      5      6     1
6   3      1      2      3     1