在R中基于Band列填充Cause与Fate_Date并保留最早Capture_Date
解决方案
可以使用dplyr包完成需求,步骤如下:
- 先确保安装并加载
dplyr:
install.packages("dplyr") library(dplyr)
- 分组处理数据:
result_df <- df %>% # 按动物编号分组 group_by(Band) %>% # 将组内非空的Cause和Fate_Date值填充到所有行 mutate( Cause = first(na.omit(Cause[Cause != ""])), Fate_Date = first(na.omit(Fate_Date)) ) %>% # 筛选每个动物的首次捕获记录 filter(Capture_Date == min(Capture_Date)) %>% # 保留需要的列 select(Capture_Date, Band, Cause, Fate_Date) %>% # 取消分组 ungroup()
代码说明
group_by(Band):将数据按唯一动物编号分组,保证同一只动物的所有记录在同一组内处理。mutate(...):针对Cause和Fate_Date,提取组内第一个非空/非NA的值,赋值给组内所有行,完成填充。filter(Capture_Date == min(Capture_Date)):在每个组中筛选出捕获日期最早的记录,即首次捕获记录。select(...):仅保留需求的核心列:首次捕获日期、动物编号、命运原因、命运日期。
运行后得到的result_df结果示例:
# # A tibble: 5 × 4 # Capture_Date Band Cause Fate_Date # <date> <chr> <chr> <date> # 1 2025-01-01 803 censor 2026-07-01 # 2 2025-01-01 804 LA 2025-06-01 # 3 2025-01-01 807 LA 2025-08-01 # 4 2025-01-01 808 UNK 2025-09-01 # 5 2025-01-01 809 LA 2025-08-27
内容的提问来源于stack exchange,提问作者Garrett Roberts
相关产品推荐
相关产品推荐

