在R语言中按identifier去重,多出现项仅保留variable='x'的行
问题描述
给定如下数据集:
| identifier | variable |
|---|---|
| patient1 | y |
| patient2 | x |
| patient2 | y |
| patient2 | y |
| patient3 | x |
| patient3 | y |
需要在R中实现:按identifier字段去重,每个identifier仅保留一行;若某个identifier出现多次,仅保留其中variable等于"x"的行。
解决方案
首先构造示例数据框,方便复现需求:
df <- data.frame( identifier = c("patient1", "patient2", "patient2", "patient2", "patient3", "patient3"), variable = c("y", "x", "y", "y", "x", "y") )
方法1:使用dplyr包(tidyverse风格)
通过分组筛选直接实现需求,逻辑清晰直观:
library(dplyr) result_df <- df %>% group_by(identifier) %>% # 筛选规则:要么是variable为"x",要么该分组仅一行(对应唯一出现的identifier) filter(variable == "x" | n() == 1) %>% # 每个分组只取第一行,确保去重 slice_head(n = 1) %>% ungroup() print(result_df)
方法2:使用base R(无需额外安装包)
通过排序让目标行前置,再利用duplicated()函数完成去重:
# 排序:按identifier分组,让variable为"x"的行排在每组最前面 df_sorted <- df[order(df$identifier, df$variable != "x"), ] # 去重,保留每个identifier的第一行 result_df_base <- df_sorted[!duplicated(df_sorted$identifier), ] print(result_df_base)
最终输出结果
两种方法都会得到如下结果:
# identifier variable # 1 patient1 y # 2 patient2 x # 3 patient3 x
内容的提问来源于stack exchange,提问作者lovebead33
相关产品推荐
相关产品推荐

