如何在R中识别重复dataframe行并分类含ORPHAN标识的组?
解决方案:用dplyr分组处理鸟类康复数据
针对你的需求,我们可以直接用dplyr的分组操作完成,无需筛选重复行,能保留所有行(包括UNK行)同时完成分组编号和幼鸟组标记。
步骤代码
假设你的数据框名为bird_data,包含Species、Date1、Date2、Cause等列,执行以下代码:
# 安装并加载dplyr(首次使用需安装) # install.packages("dplyr") library(dplyr) # 处理数据 bird_data_processed <- bird_data %>% # 按物种、Date1、Date2分组,保留所有行 group_by(Species, Date1, Date2) %>% mutate( # 组内每行的子编号(从1开始递增) sub_id = row_number(), # 全局分组主编号(每个唯一分组对应一个序号) main_id = cur_group_id(), # 拼接成你需要的x.y格式分组编号 group_number = paste(main_id, sub_id, sep = "."), # 判断该组是否为幼鸟组:组内存在ORPHAN则标记为"是" is_orphan_group = ifelse(any(Cause == "ORPHAN"), "是", "否") ) %>% # 取消分组(可选,根据后续操作需求) ungroup() # 查看处理结果 head(bird_data_processed)
关键说明
- 分组逻辑:
group_by(Species, Date1, Date2)会把所有属于同一物种、同一日期组合的行归为一组,不管是ORPHAN还是UNK行都保留在组内,彻底解决你之前遗漏UNK行的问题。 - 分组编号生成:
cur_group_id()给每个唯一的分组分配全局序号(比如冠蓝鸦的某日期组是1,知更鸟的某日期组是2),row_number()给组内每行分配子序号,两者拼接成x.y格式的编号。 - 幼鸟组标记:
any(Cause == "ORPHAN")检查组内是否存在至少一行Cause为ORPHAN,只要满足条件,组内所有行(包括UNK行)都会被标记为幼鸟组。
额外提醒
如果你的Date1和Date2是文本格式,可能存在日期格式不统一的问题(比如2023-01-01和01/01/2023),可以先用lubridate包统一日期格式:
# 安装并加载lubridate(首次使用需安装) # install.packages("lubridate") library(lubridate) bird_data <- bird_data %>% mutate( Date1 = ymd(Date1), # 若原始格式是日/月/年,改用dmy() Date2 = ymd(Date2) )
内容的提问来源于stack exchange,提问作者Thea Tengstrom
相关产品推荐
相关产品推荐

