如何对DataFrame指定列执行n行滞后操作并扩展数据框长度?
对DataFrame指定列执行多行滞后并扩展行数的实现方法
我需要对DataFrame中的指定列(A、C、D)执行n行(例如2行)的下移(滞后)操作,同时添加新行以生成新的DataFrame,目前只找到针对指定列执行1行滞后的相关内容。
模拟数据
df <- data.frame( A = seq(1,7), B = seq(8,14), C = seq(15,21), D = seq(22,28) ) df
输出结果:
> df A B C D 1 8 15 22 2 9 16 23 3 10 17 24 4 11 18 25 5 12 19 26 6 13 20 27 7 14 21 28
期望的2行滞后输出
> df.lag.example A B C D NA 8 NA NA NA 9 NA NA 1 10 15 22 2 11 16 23 3 12 17 24 4 13 18 25 5 14 19 26 6 NA 20 27 7 NA 21 28
实现方法
方法1:Base R 原生实现
直接构造各列的目标向量,最后合并为新DataFrame:
n <- 2 cols_to_lag <- c("A", "C", "D") # 处理需要滞后的列:前n个NA + 原列前(nrow(df)-n)行 + 原列最后n行 lagged_cols <- lapply(cols_to_lag, function(col) { c(rep(NA, n), df[[col]][1:(nrow(df)-n)], df[[col]][(nrow(df)-n+1):nrow(df)]) }) names(lagged_cols) <- cols_to_lag # 处理B列:原列前n行 + 原列(n+1)到末尾行 + 后n个NA b_col <- c(df$B[1:n], df$B[(n+1):nrow(df)], rep(NA, n)) # 合并并调整列顺序 df_lag <- as.data.frame(cbind(lagged_cols, B = b_col)) df_lag <- df_lag[, c("A", "B", "C", "D")] # 查看结果 print(df_lag)
方法2:dplyr 简洁实现
分三段构造数据后合并,借助dplyr的行绑定和列操作函数:
library(dplyr) n <- 2 cols_to_lag <- c("A", "C", "D") # 构造前n行:指定列设为NA,保留原B列前n行 top_part <- df[1:n, ] %>% mutate(across(all_of(cols_to_lag), ~ NA)) # 构造中间行:指定列取原数据前(nrow(df)-n)行,B列取原数据(n+1)到末尾行 middle_part <- df[1:(nrow(df)-n), cols_to_lag] %>% bind_cols(B = df[(n+1):nrow(df), "B"]) # 构造后n行:指定列取原数据最后n行,B列设为NA bottom_part <- df[(nrow(df)-n+1):nrow(df), cols_to_lag] %>% mutate(B = NA) # 合并所有部分 df_lag <- bind_rows(top_part, middle_part, bottom_part) # 查看结果 print(df_lag)
两种方法运行后都能得到符合期望的输出,可根据使用习惯选择。
内容的提问来源于stack exchange,提问作者shollaback
相关产品推荐
相关产品推荐

