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

R语言按分组取另一列上一行值创建新列的实现方法

R按分组生成begin.date列实现方案

需求为按site字段分组,组内第一行的begin.date取本行setup.date值,组内其余行的begin.date取同组上一行的revisit.date值,以下提供两种常用实现方式:

方案1:dplyr实现(tidyverse生态,代码可读性高)

library(dplyr)

# 构造示例数据集(如果已有自己的数据集可跳过这步)
df <- data.frame(
  site = c("A","A","A","A","B","B","B","B"),
  setup.date = as.Date(c("2019-07-15","2019-07-15","2019-07-15","2019-07-15","2019-07-22","2019-07-22","2019-07-22","2019-07-22")),
  revisit.date = as.Date(c("2019-07-22","2019-07-29","2019-08-04","2019-08-18","2019-07-23","2019-07-30","2019-08-05","2019-08-19")),
  end.date = as.Date(c("2019-07-22","2019-07-29","2019-08-01","2019-08-18","2019-07-23","2019-07-25","2019-08-05","2019-08-19"))
)

# 计算生成begin.date列
result <- df %>%
  group_by(site) %>%
  mutate(
    # 先取分组内上一行的revisit.date
    begin.date = lag(revisit.date),
    # 分组第一行替换为setup.date
    begin.date = if_else(row_number() == 1, setup.date, begin.date)
  ) %>%
  ungroup()

运行后查看前两行结果,和预期样例完全匹配:

site  setup.date revisit.date end.date   begin.date
  <chr> <date>     <date>       <date>     <date>    
1 A     2019-07-15 2019-07-22   2019-07-22 2019-07-15
2 A     2019-07-15 2019-07-29   2019-07-29 2019-07-22

方案2:data.table实现(大数据量场景性能更优)

library(data.table)

# 将数据转为data.table格式,已有数据集直接运行这行即可
setDT(df)

# 按分组生成滞后值
df[, begin.date := shift(revisit.date, type = "lag"), by = site]
# 替换每个分组第一行的值为setup.date
df[df[, .I[1], by = site]$V1, begin.date := setup.date]

注意:运行代码前请确认setup.date、revisit.date列已为Date类型,若为字符串可先用as.Date(你的日期列, format = "%Y-%m-%d")转换,避免类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:21:46