如何按name、clinic、year分组,条件式mutate()统一tested列取值?
数据集处理解决方案
需求
- 按
name、clinic、year分组,若组内存在tested值为yes的行,将该组所有行的tested统一设为yes - 基于处理后的结果,为每个
name+clinic+year组合仅保留一行数据
示例原始数据
| name | clinic | year | date | tested |
|---|---|---|---|---|
| patientx | xxy | 2022 | 四月 | yes |
| patientx | xxy | 2022 | 五月 | no |
| patientxy | ggf | 2019 | 一月 | no |
| patientxy | ggf | 2019 | 二月 | yes |
| patientxyz | ffr | 2018 | 三月 | yes |
| patientxyz | ffr | 2019 | 五月 | no |
处理代码(R + dplyr)
library(dplyr) # 构造示例数据集 df <- tibble( name = c("patientx", "patientx", "patientxy", "patientxy", "patientxyz", "patientxyz"), clinic = c("xxy", "xxy", "ggf", "ggf", "ffr", "ffr"), year = c(2022, 2022, 2019, 2019, 2018, 2019), date = c("四月", "五月", "一月", "二月", "三月", "五月"), tested = c("yes", "no", "no", "yes", "yes", "no") ) # 执行数据处理 processed_df <- df %>% # 第一步:分组统一tested字段值 group_by(name, clinic, year) %>% mutate(tested = if_else(any(tested == "yes"), "yes", tested)) %>% ungroup() %>% # 第二步:按分组保留一行(此处保留最早日期的行,可按需调整) group_by(name, clinic, year) %>% slice_min(date, n = 1) %>% ungroup()
处理后结果
| name | clinic | year | date | tested |
|---|---|---|---|---|
| patientx | xxy | 2022 | 四月 | yes |
| patientxy | ggf | 2019 | 一月 | yes |
| patientxyz | ffr | 2018 | 三月 | yes |
| patientxyz | ffr | 2019 | 五月 | no |
说明
- 若需要保留分组内最晚日期的行,将
slice_min(date)替换为slice_max(date)即可 - 也可根据其他自定义逻辑选择保留的行,比如使用
filter()筛选特定条件
内容的提问来源于stack exchange,提问作者Vicki Latham
相关产品推荐
相关产品推荐

