如何改变 dplyr 中的 for 循环

Bre*_*ins 5 r dplyr

我想为数据框中的列创建多个值范围的滞后变量。我的代码可以成功执行我想要的操作,但无法根据我的需要进行扩展(数百次迭代)

我的下面的代码成功地完成了我想要的操作,但无法根据我的需要进行扩展(数百次迭代)

Lake_Lag <- Lake_Champlain_long.term_monitoring_1992_2016 %>% 
group_by(StationID,Test) %>% 
   arrange(StationID,Test,VisitDate) %>% 
   mutate(lag.Result1 = dplyr::lag(Result, n = 1, default = NA))%>% 
   mutate(lag.Result5 = dplyr::lag(Result, n = 5, default = NA))%>% 
   mutate(lag.Result10 = dplyr::lag(Result, n = 10, default = NA))%>% 
   mutate(lag.Result15 = dplyr::lag(Result, n = 15, default = NA))%>% 
   mutate(lag.Result20 = dplyr::lag(Result, n = 20, default = NA))
Run Code Online (Sandbox Code Playgroud)

我希望能够使用列表 c(1,5,10,15,20) 或范围 1:150 为我的数据框创建滞后变量。

bsc*_*idr 11

dplyr这是一种利用包中包含的一些“整洁的评估助手”的方法rlang

基本思想是创建一个新列,mutate()其名称基于 for 循环提供的字符串。

library(dplyr)

grouped_data <- Lake_Champlain_long.term_monitoring_1992_2016 %>% 
  group_by(StationID,Test) %>% 
  arrange(StationID,Test,VisitDate)

for (lag_size in c(1, 5, 10, 15, 20)) {

  new_col_name <- paste0("lag_result_", lag_size)

  grouped_data <- grouped_data %>% 
    mutate(!!sym(new_col_name) := lag(Result, n = lag_size, default = NA))
}
Run Code Online (Sandbox Code Playgroud)

当使用包中的或等函数时,这是一种动态编写,等sym(new_col_name) :=的方式。lag_result_1 =lag_result_2 =mutate()summarize()dplyr