如何根据行索引或行值对DataFrame执行Lag/Lead操作以实现指定输出
解决DataFrame中基于行值/索引的Lag/Lead类填充问题
嘿,结合你的示例数据和期望输出,我猜你真正需要的是把DataFrame里的日期值向下填充到后续的非日期行,直到遇到下一个新日期为止。咱们先把问题拆解开,一步步来解决:
首先先确认你的示例数据集:
id <- c(1,1,1,1,1,1) a <- c("X1","Mar-20","X2","X3","Apr-20", "X4") test <- data.frame(id,a)
一、基于行值的条件填充(贴合你的期望输出)
你的期望输出是让Mar-20覆盖它之后的X2、X3行,Apr-20覆盖之后的X4行,这本质是锚定特定行的值,向下填充后续行。这里用dplyr+tidyr的组合来实现最方便:
library(dplyr) library(tidyr) # 1. 标记出日期行,非日期行设为NA;2. 向下填充NA值;3. 整理列名 result <- test %>% # 用正则匹配日期格式(比如Mar-20这种格式),匹配到的保留原值,否则设为NA mutate(temp_a = ifelse(grepl("^[A-Za-z]{3}-\\d{2}$", a), a, NA)) %>% # 把NA值用上方最近的非NA值填充(向下传播日期) fill(temp_a, .direction = "down") %>% # 替换掉原来的a列,得到最终结果 select(id, a = temp_a) print(result)
运行后就能得到你想要的输出:
id a 1 1 Mar-20 2 1 Mar-20 3 1 Mar-20 4 1 Apr-20 5 1 Apr-20 6 1 Apr-20
二、单纯基于行索引的Lag/Lead操作
如果只是想单纯取上一行(Lag)或下一行(Lead)的值,直接用dplyr的lag()和lead()函数就可以:
1. Lag操作(获取上一行的值)
test %>% mutate(lag_a = lag(a))
输出会新增一列lag_a,第一行是NA,后续行是上一行的a列值。
2. Lead操作(获取下一行的值)
test %>% mutate(lead_a = lead(a))
输出新增一列lead_a,最后一行是NA,前面的行是下一行的a列值。
内容的提问来源于stack exchange,提问作者MGJ-123
相关产品推荐
相关产品推荐

