R语言 按一列对表进行分组并按另一列进行筛选,删除组中多次出现筛选的行

new9mtju  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(168)

我有一张table看起来像这样。。但是组和对比比这要长得多,但这基本上是重复继续的方式,使表不必要地长。
摘要
| 集团|对比度|
| - -----|- -----|
| 一个|X-Y|
| 一个|X-Z|
| 一个|Y-Z|
| B| X-Y|
| B| X-Z|
| B| Y-Z|
| C类|X-Y|
| C类|X-Z|
| C类|Y-Z|
| D级|N-M|
| D级|R-S|
| D级|R-O|
| E级|N-M|
| E级|R-S|
| E级|X-S|
我想过滤表格,以便对比不会在组间重复。我希望所有的团体都有代表
我希望结果看起来像
| 集团|对比度|
| - -----|- -----|
| 一个|X-Y|
| B| X-Z|
| C类|Y-Z|
| D级|N-M|
| D级|R-S|
| D级|R-O|
| E级|X-S|

summary = as_tibble(summary) %>% group_by(Group) %>% filter(duplicated(Contrast))

这不管用

kzmpq1sx

kzmpq1sx1#

  • EDIT* 使用新数据,尝试重建distinct之后的组。如果这不是真实的的数据,则该方法可能随时失败,因为需求是不对称的。
df %>% 
  distinct(Contrast, .keep_all=T) %>% 
  rowwise() %>% 
  mutate(uniqCon = sum(unique(Contrast) == df$Contrast)) %>% 
  ungroup() %>% 
  mutate(uniqCon = min(uniqCon), 
         Group = LETTERS[which(LETTERS == Group[1]):
          (which(LETTERS == Group[1])+(uniqCon[1]-1))], .by = Group) %>% 
  select(-uniqCon)
# A tibble: 7 × 2
  Group Contrast
  <chr> <chr>   
1 A     X-Y     
2 B     X-Z     
3 C     Y-Z     
4 D     N-M     
5 D     R-S     
6 D     R-O     
7 E     X-S
数据
df <- structure(list(Group = c("A", "A", "A", "B", "B", "B", "C", "C", 
"C", "D", "D", "D", "E", "E", "E"), Contrast = c("X-Y", "X-Z", 
"Y-Z", "X-Y", "X-Z", "Y-Z", "X-Y", "X-Z", "Y-Z", "N-M", "R-S", 
"R-O", "N-M", "R-S", "X-S")), class = "data.frame", row.names = c(NA, 
-15L))
  • 老办法 *

类似这样的东西,使用cur_group_id()

library(dplyr)

df %>% 
  summarize(Contrast = Contrast[cur_group_id()], .by = Group)
  Group Contrast
1     A      X-Y
2     B      X-Z
3     C      Y-Z

相关问题