我不太擅长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
,然后过滤其余的行,以得到Name
和ID
的组合。
所以,我想得到的是:
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)
1条答案
按热度按时间wwtsj6pe1#
如果这些数据代表了你的真实的数据,一种方法是当
ID
等于最小ID时进行过滤,同时按Name
分组:一个稍微灵活一点的方法(即,如果
ID
不是升序的,一个复杂的字符串等)是创建一个临时组ID(temp
),并使用slice_min
通过Name
选择这些ID中的最小值:(Note在你想要的数据中可能有一个错字,因为在你的示例数据中没有
Grade == "Fail"
,而Name == "Clark"
,所以它应该返回Pass
)