使用purrr的map_vec生成多阶滞后值报错求助
解决用purrr生成多阶滞后值的问题
错误原因分析
你的代码报错核心是参数传递逻辑错误:
map_vec(.x = 1:3, .f = lag)会将1:3的每个元素作为lag的第一个参数(即待滞后的向量),而不是作为lag的n参数。这相当于执行lag(1)、lag(2)、lag(3),每个返回单个NA,最终得到长度为3的向量,和数据框100行的长度不匹配。- 后续包裹
list()的写法虽然解决了长度问题,但依然没有将x传递给lag的第一个参数,所以得到的全是NA。
解决方案
根据你的需求,分两种场景提供实现方式:
场景1:生成单独的滞后列(每个阶数对应一列)
如果需要将1-3阶滞后分别存为独立的列,可以用map_dfc结合命名向量生成带后缀的列名:
library(dplyr) library(purrr) set.seed(123) # 设种子保证可复现 df <- data.frame( x = sample(1000, size = 100) ) # 生成y_lag_1、y_lag_2、y_lag_3三列 df_with_lags <- df %>% mutate(map_dfc(set_names(1:3, paste0("y_lag_", 1:3)), ~lag(x, n = .x)))
场景2:每行存储包含3个滞后值的数值向量(列表列)
如果需要每行对应一个包含1-3阶滞后值的向量,可以先生成所有滞后列,再将每行的滞后值打包成向量:
df_with_lag_vec <- df %>% mutate( y1 = lag(x, 1), y2 = lag(x, 2), y3 = lag(x, 3) ) %>% rowwise() %>% mutate(y = c(y1, y2, y3)) %>% ungroup() %>% select(x, y) # 保留原列和滞后向量列 # 查看结果 head(df_with_lag_vec$y)
或者更简洁的purrr链式写法:
df_with_lag_vec <- df %>% mutate(y = transpose(map(1:3, ~lag(x, n = .x))) %>% map(unlist))
关键知识点
- 使用
purrr函数时,要明确参数传递的对应关系,当需要给目标函数(如lag)传递指定参数时,要用匿名函数(~语法)明确指定参数值。 map_dfc可以将多个向量按列合并为数据框,适合生成多列滞后值;transpose则可以将多个长度相同的向量转换为按行分组的列表,适合生成每行的滞后向量。
内容的提问来源于stack exchange,提问作者TheGoat
相关产品推荐
相关产品推荐

