如何用R语言dplyr按组保留含最新年份数据的所有行?
筛选包含指定年份分组的所有行(dplyr实现)
需求:若数据中
name列的分组(A、B、C、D)包含year列值为2021的行,则保留该分组的所有行;否则删除该分组的全部行。
示例数据
name <- c("A","A","A","B","B","C","C","C","D","D","D","D") year <- c(2018,2019,2020,2018,2019,2019,2020,2021,2018,2019,2020,2021) col <- c(2,1,5,6,7,5,7,3,7,9,1,4) # 注意:cbind生成的是矩阵,转成数据框并修正数据类型 df <- as.data.frame(cbind(name,year,col)) df$year <- as.numeric(df$year) df$col <- as.numeric(df$col)
解决方案
不需要额外的Count类变量,直接用dplyr的分组结合any()函数就能实现需求:
library(dplyr) df2 <- df %>% group_by(name) %>% filter(any(year == 2021)) %>% ungroup()
代码逻辑说明
group_by(name):按name字段分组,把数据拆成A、B、C、D四个子数据集filter(any(year == 2021)):对每个分组检查是否存在year为2021的行,只要有一行满足,就保留整个分组的所有行ungroup():取消分组标记,让结果回到常规数据框格式
输出结果
运行后df2的内容与期望一致:
> df2 # A tibble: 7 × 3 name year col <chr> <dbl> <dbl> 1 C 2019 5 2 C 2020 7 3 C 2021 3 4 D 2018 7 5 D 2019 9 6 D 2020 1 7 D 2021 4
内容的提问来源于stack exchange,提问作者MintySusan
相关产品推荐
相关产品推荐

