R语言dplyr包fill函数按组填充数据框失效问题
问题解决:分组填充日期列并提取每行最早日期
问题背景
按record_id分组,对数据框中的A_returne、C_returned_date、D_returned_date列执行fill(.direction = "downup")操作未达预期,最终目标是先填充这些日期列,再找出每行的最早日期。
原始数据与代码
数据结构
mydata <- structure( list( record_id = c(1L, 2L, 3L, 4L, 5L, 5L), inst = c("", "", "", "", "", "rectr"), instance = c(NA, NA, NA, NA, NA, 1L), A_returne = c("", "2019-11-07", "2019-11-08", "2019-11-07", "", ""), B_date = c("2018-10-29", "", "", "", "2018-11-27", ""), C_returned_date = c("2018-11-10", "", "", "", "2018-12-12", ""), D_returned_date = c("2021-05-21", "", "", "", "", ""), A_ordered = c("", "", "", "", "", "2021-01-14"), B_received = c("", "", "", "", "", "2021-02-17") ), row.names = c(NA, 6L), class = "data.frame" )
原始代码
mydata %>% group_by(record_id) %>% fill(A_returne,C_returned_date,D_returned_date, .direction ="downup")
问题原因
fill()函数默认只处理NA值,但你的数据中空缺的日期是用空字符串""表示的,所以fill()不会对这些空字符串进行填充,这就是操作未达预期的核心原因。
解决方案
步骤说明
- 将空字符串转换为NA,让
fill()能识别空缺值 - 按
record_id分组,用downup方向填充指定日期列 - 将填充后的列转换为日期格式,方便后续比较
- 提取每行指定日期列中的最早日期
完整代码
library(dplyr) library(tidyr) # 处理空字符串+分组填充 filled_data <- mydata %>% mutate(across(c(A_returne, C_returned_date, D_returned_date), ~na_if(., ""))) %>% group_by(record_id) %>% fill(A_returne, C_returned_date, D_returned_date, .direction = "downup") %>% ungroup() %>% # 转换为日期类型 mutate(across(c(A_returne, C_returned_date, D_returned_date), as.Date)) # 提取每行最早日期 final_data <- filled_data %>% rowwise() %>% mutate(earliest_date = min(c_across(A_returne:D_returned_date), na.rm = TRUE)) %>% ungroup() print(final_data)
结果说明
执行后,每个record_id组内的空缺日期会被上下非空值填充,新增的earliest_date列会显示该行三个日期列中的最早日期。
内容的提问来源于stack exchange,提问作者akang
相关产品推荐
相关产品推荐

