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

如何用同一ID上一行Date_last值替换当前行Date_first列的NA值

解决方案

以下是三种不同的实现方式,均适配你提到的「NA仅出现在各ID分组第二行」的前提:


方法1:tidyverse(dplyr) 实现

适合偏好易读代码的场景:

  1. 首先构造示例数据(你已有数据可跳过这步)
library(dplyr)
df <- tibble(
  ID = c(1,1,2,2),
  Date_first = as.Date(c("2020-01-01", "2020-05-21", "2019-06-01", NA)),
  Date_last = as.Date(c("2020-05-21", "2020-09-15", "2019-10-30", "2020-02-06"))
)
  1. 核心处理代码
df_result <- df %>%
  group_by(ID) %>% # 按ID分组
  mutate(Date_first = ifelse(is.na(Date_first), lag(Date_last), Date_first)) %>%
  ungroup() # 解除分组,避免后续操作受分组影响

注:lag(Date_last)会自动取同分组内上一行的Date_last值,符合你的需求


方法2:data.table 实现

适合处理十万行以上的大数据量场景,运算效率更高:

library(data.table)
setDT(df) # 将数据框转为data.table格式
# 按ID分组替换NA
df[, Date_first := fifelse(is.na(Date_first), shift(Date_last), Date_first), by = ID]

方法3:基础R 实现

无需加载任何第三方依赖包:

# 先按ID排序,保证同组数据行连续(如果你的数据已经是有序状态可跳过)
df <- df[order(df$ID), ]
# 定位Date_first为NA的行,直接替换为上一行的Date_last值
na_idx <- which(is.na(df$Date_first))
df$Date_first[na_idx] <- df$Date_last[na_idx - 1]

注:该写法仅适用于你提到的「NA仅出现在各ID分组第二行」的场景,无需额外做分组边界校验


内容的提问来源于stack exchange,提问作者Christine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:00:04