R语言按ID去重并优先保留event=1值的数据子集化问题
解决方案:用dplyr实现按ID优先保留event=1的记录
可以通过分组排序后取首行的方式轻松实现需求,具体步骤如下:
步骤1:构造示例数据(可替换为你的实际数据集)
library(dplyr) df <- tibble( ID = c("A", "A", "A", "A", "B", "B", "B", "C", "C"), event = c(1, 1, 0, 1, 0, 0, 0, 0, 1) )
步骤2:核心处理代码
方法一:排序取首行(推荐,逻辑直观)
df_result <- df %>% group_by(ID) %>% # 按event降序排列,让event=1的行排在每组最前面 arrange(desc(event), .by_group = TRUE) %>% # 提取每组的第一行 slice(1) %>% # 取消分组状态 ungroup()
方法二:条件筛选后取首行
df_result <- df %>% group_by(ID) %>% # 判断每组是否存在event=1,是则筛选event=1,否则筛选event=0 filter(event == case_when(any(event == 1) ~ 1, TRUE ~ 0)) %>% # 取筛选后的第一行(避免同event有多条记录) slice(1) %>% ungroup()
输出结果
运行上述代码后,df_result的输出与你期望的一致:
# A tibble: 3 × 2 ID event <chr> <dbl> 1 A 1 2 B 0 3 C 1
逻辑说明
- 两种方法都通过
group_by(ID)将数据按ID分组,确保每个ID单独处理; - 方法一利用降序排序,让优先级更高的
event=1行自动排在每组首位,直接取首行即可; - 方法二通过
case_when判断每组是否存在event=1,精准筛选目标行后取首行,逻辑更直白。
内容的提问来源于stack exchange,提问作者ctk1100
相关产品推荐
相关产品推荐

