识别变量集具有相同值的观察组
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.a
、attr.b
和 attr.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
粘贴的元素创建单个字符串,使用 match
在 attr
上并按索引分组,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
我有一个 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.a
、attr.b
和 attr.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
粘贴的元素创建单个字符串,使用 match
在 attr
上并按索引分组,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