You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()不会对这些空字符串进行填充,这就是操作未达预期的核心原因。

解决方案

步骤说明

  1. 将空字符串转换为NA,让fill()能识别空缺值
  2. 按record_id分组,用downup方向填充指定日期列
  3. 将填充后的列转换为日期格式,方便后续比较
  4. 提取每行指定日期列中的最早日期

完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:40:23