如何在dplyr中更改循环

时间:2019-05-01 18:10:05

标签: r dplyr

我想为数据框中的一列创建多个滞后变量,以获取一系列值。我的代码可以成功完成我想做的事,但不能满足我的需要(数百次迭代)

下面有我的代码,可以成功完成我想做的事,但不能满足我的需要(数百次迭代)

str

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

2 个答案:

答案 0 :(得分:0)

我们可以使用shift中的data.table,它可以为n取多个值。根据{{​​1}}

  

n-非负整数向量,表示领先或落后于输入的偏移量。要创建多个前导/滞后向量,请为n提供多个值

通过?shift中的“ StationID”,“测试”,“ VisitDate”将“ data.frame”转换为“ data.table”(setDT),order,并按“ StationID”,“测试”),以i作为值的向量,获取“结果”的lagtype的默认shift为“滞后”),并将输出分配(n到由(:=创建)的列名称向量

paste0

注意:显示了一种非常有效的解决方案

答案 1 :(得分:0)

这是一种利用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))
}

在使用{{1}中的sym(new_col_name) :=lag_result_1 =之类的功能时,lag_result_2 =是一种动态写入mutate()summarize()等的方式。 }包。