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
相关产品推荐
相关产品推荐

