R语言按条件处理Visite列重复值的技术求助
解决ID分组下Visite重复值的处理问题
我来帮你搞定这个重复值处理的需求!首先我先把你的数据集整理成直观的表格形式,方便后续分析:
| ID | Visite |
|---|---|
| 1 | 1 |
| 1 | 4 |
| 1 | 4 |
| 1 | 5 |
| 1 | 6 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 2 | 4 |
| 2 | 4 |
| 2 | 6 |
| 2 | 7 |
| 3 | 1 |
| 3 | 2 |
| 3 | 2 |
| 3 | 3 |
| 3 | 4 |
| 3 | 5 |
| 4 | 1 |
| 4 | 2 |
| 4 | 3 |
下面我用R语言的dplyr包(统计分析中常用的数据处理工具)来实现你要求的规则,步骤清晰,容易理解和修改:
第一步:加载工具包并构建数据集
首先我们把你的数据转换成可处理的格式,同时保留你提到的200个其他变量(示例中用随机数占位):
library(dplyr) # 构建你的数据集 df <- tibble( ID = c(1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4), Visite = c(1,4,4,5,6,1,2,3,4,4,6,7,1,2,2,3,4,5,1,2,3), # 替换成你实际的200个变量 other_variables = rnorm(nrow(df)) )
第二步:按规则处理重复的Visite值
核心思路是按ID分组,先标记重复项,再检查相邻访视的存在情况,最后应用规则修改或删除行:
df_processed <- df %>% # 按ID分组,后续操作都在每个ID内部进行 group_by(ID) %>% # 标记当前ID下哪些Visite是重复的,同时记录该ID的所有访视值 mutate( # 标记是否为重复项(包括第一次出现的重复值) is_duplicate = duplicated(Visite) | duplicated(Visite, fromLast = TRUE), # 把当前ID的所有Visite值存成列表,方便后续检查相邻值 all_visits_in_id = list(unique(Visite)) ) %>% # 再按ID+Visite分组,处理每个重复的访视组 group_by(ID, Visite) %>% mutate( # 给每个重复组内的行编序号,方便区分保留的第一行和要处理的重复行 row_num_in_dup = row_number(), # 检查相邻低访视(Visite-1)是否缺失 low_visit_missing = !((Visite - 1) %in% unlist(all_visits_in_id)), # 检查相邻高访视(Visite+1)是否缺失 high_visit_missing = !((Visite + 1) %in% unlist(all_visits_in_id)) ) %>% ungroup() %>% # 应用规则修改或筛选行 mutate( # 规则1:重复行且低访视缺失,把Visite改成低访视 Visite = case_when( is_duplicate & row_num_in_dup > 1 & low_visit_missing ~ Visite - 1, # 规则2:重复行且高访视缺失,把Visite改成高访视 is_duplicate & row_num_in_dup > 1 & high_visit_missing ~ Visite + 1, # 其他情况保留原Visite TRUE ~ Visite ) ) %>% # 规则3:如果高低访视都存在,删除重复的行(只保留每个重复组的第一行) filter(!(is_duplicate & row_num_in_dup > 1 & !low_visit_missing & !high_visit_missing)) %>% # 清理过程中生成的临时变量 select(-is_duplicate, -all_visits_in_id, -row_num_in_dup, -low_visit_missing, -high_visit_missing) %>% # 按ID和Visite重新排序,方便查看结果 arrange(ID, Visite)
处理结果验证
对应你的示例数据,处理后会得到:
- ID1的两个4:因为低访视3不存在,所以其中一个4被改为3
- ID2的两个4:因为高访视5不存在,所以其中一个4被改为5
- ID3的两个2:因为低访视1和高访视3都存在,所以删除其中一行2
- ID4没有重复Visite,保持原样
如果你习惯用Python的pandas,也可以实现完全相同的逻辑,核心是通过groupby分组后,对每个分组内的重复值进行判断和处理。
内容的提问来源于stack exchange,提问作者Christina Sobotzki
相关产品推荐
相关产品推荐

