如何在group_by中根据多个条件进行筛选?

ffx8fchx  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(105)

我不太擅长R,而且我很难弄清楚如何连续地做一些事情。
这是我的起始数据集:

df <- data.frame (Name  = c("Alex", "Alex", "Alex", "Alex", "Alex", "Alex", "Alex", "Beth", "Beth", "Clark"),
                  ID = c(1, 1, 2, 2, 3, 3, 3, 4, 4, 5),
                  Month = c(4, 7, 4, 6, 7, 8, 8, 1, 1, 6),
                  Day = c(5, 5, 5, 5, 8, 9, 9, 2, 2, 7),
                  Grade = c("Pass", "Fail", "Pass", "Fail", "Pass", "Pass", "Fail", "Pass", "Fail", "Pass"))

对于每个唯一的Name,取第一个ID,然后过滤其余的行,以得到NameID的组合。
所以,我想得到的是:

Name   ID  Month  Day  Grade
Alex   1   4      5    Pass
Alex   1   7      5    Fail
Beth   4   1      2    Fail
Beth   4   1      2    Pass
Clark  5   6      7    Fail

Goal output
我尝试使用group_by,拉取Name和ID,然后过滤;但是当使用%in%时,您无法筛选多个条件。这是我的代码:

df2 <- df %>% 
  group_by(Name) %>%
  group_modify(~ head(.x,1L)) %>%
  pull(Name,ID)

df3 <- df %>%
  filter(Name %in% df2, ID %in% df2)
wwtsj6pe

wwtsj6pe1#

如果这些数据代表了你的真实的数据,一种方法是当ID等于最小ID时进行过滤,同时按Name分组:

df %>%
  filter(ID == min(ID), .by = Name)

   Name ID Month Day Grade
1  Alex  1     4   5  Pass
2  Alex  1     7   5  Fail
3  Beth  4     1   2  Pass
4  Beth  4     1   2  Fail
5 Clark  5     6   7  Pass

一个稍微灵活一点的方法(即,如果ID不是升序的,一个复杂的字符串等)是创建一个临时组ID(temp),并使用slice_min通过Name选择这些ID中的最小值:

library(dplyr)

df %>%
  mutate(temp = cur_group_id(), .by = c(Name, ID)) %>%
  slice_min(temp, by = Name) %>% select(-temp)

   Name ID Month Day Grade
1  Alex  1     4   5  Pass
2  Alex  1     7   5  Fail
3  Beth  4     1   2  Pass
4  Beth  4     1   2  Fail
5 Clark  5     6   7  Pass

(Note在你想要的数据中可能有一个错字,因为在你的示例数据中没有Grade == "Fail",而Name == "Clark",所以它应该返回Pass

相关问题