我有一個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。在示例中,grp1 和 3 包含相同的觀測值集(但是,觀測值集的排序方式不同)。同樣在示例中,grp2 僅包含一組與grp1 和 3相同的觀察值。只有在所有觀察值集相同時才應識別它。
grp只要清楚,如何識別相同的s并不重要,但可能看起來像這樣:
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
謝謝!
uj5u.com熱心網友回復:
我們可以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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/420958.html
標籤:
