如何用dplyr识别同一日期时段下分组个体的重复记录
动物观测数据集重复组标记解决方案
问题背景
处理一个15000+行的动物观测数据集,观测时段为30分钟,分为GroupA、GroupB、GroupC三组。每行包含Date(DD/MM/YYYY)、TimeStart(如6:00、6:30)、IndividualsObserved字段。存在以下情况:
- 组可能混合记录(如
GroupB;C) - 同一组的个体可能在同一
Date+TimeStart下被拆分成多行记录
需要新增MatchedSimultaneousEntries列:当某行对应的任意一组在同日期时段有其他行记录时标记为Yes,否则为No。
原始数据示例
Date Group TimeStart IndividualsObserved 01/01/2018 GroupA 6:00 IndA1,IndA2,IndA3,IndA8 01/01/2018 GroupB;C 6:00 IndB1,IndB4,IndB7,IndC2,IndC5,IndC10 01/01/2018 GroupB 6:00 IndB2,IndB3,IndB5,IndB6,IndB8,IndB9
期望输出示例
Date Group TimeStart IndividualsObserved MatchedSimultaneousEntries 01/01/2018 GroupA 6:00 IndA1,IndA2,IndA3,IndA8 No 01/01/2018 GroupB;C 6:00 IndB1,IndB4,IndB7,IndB10, IndC2,IndC5,IndC10 Yes 01/01/2018 GroupB 6:00 IndB2,IndB3,IndB5,IndB6,IndB8,IndB9 Yes
解决方案代码
核心思路是先拆分混合组,统计每个Date+TimeStart+单组的出现次数,再匹配回原数据判断是否存在重复组记录:
library(dplyr) library(tidyr) # 处理数据集 df_processed <- df %>% # 拆分混合组为单独行 separate_rows(Group, sep = ";") %>% # 按日期、时段、单组统计出现次数 group_by(Date, TimeStart, Group) %>% mutate(group_count = n()) %>% ungroup() %>% # 合并回原组格式(恢复混合组) group_by(Date, TimeStart, IndividualsObserved) %>% summarise( Group = paste(unique(Group), collapse = ";"), # 判断该组对应的任意单组是否出现多次 MatchedSimultaneousEntries = ifelse(any(group_count > 1), "Yes", "No") ) %>% ungroup()
代码说明
separate_rows(Group, sep = ";"):把混合组(如GroupB;C)拆分成两行,分别对应GroupB和GroupCgroup_by(Date, TimeStart, Group) %>% mutate(group_count = n()):统计每个日期+时段+单组的出现行数,若大于1说明该组在此时段有重复记录- 后续分组合并恢复原数据结构,并通过
any(group_count > 1)判断当前行是否包含有重复记录的组,标记Yes/No
内容的提问来源于stack exchange,提问作者MIGUEL
相关产品推荐
相关产品推荐

