使用dplyr和for循环添加多个滞后变量
我有我预测的时间序列数据,所以我创建了滞后变量,用于我的统计分析。我想要一个快速的方法来创建多个给定特定输入的变量,这样我就可以轻松地交叉验证和比较模型 以下示例代码为给定类别(a、B、C)的2个不同变量(共4个)添加了2个滞后: 老实说,我只是有点不知道如何让它发挥作用。我的for循环和整体逻辑的顺序是有意义的,但函数将字符转换为变量的方式和整体语法似乎有点不对劲。有没有一个简单的方法来修复这个函数以获得我想要的结果 特别是,我正在寻找:使用dplyr和for循环添加多个滞后变量,r,dplyr,R,Dplyr,我有我预测的时间序列数据,所以我创建了滞后变量,用于我的统计分析。我想要一个快速的方法来创建多个给定特定输入的变量,这样我就可以轻松地交叉验证和比较模型 以下示例代码为给定类别(a、B、C)的2个不同变量(共4个)添加了2个滞后: 老实说,我只是有点不知道如何让它发挥作用。我的for循环和整体逻辑的顺序是有意义的,但函数将字符转换为变量的方式和整体语法似乎有点不对劲。有没有一个简单的方法来修复这个函数以获得我想要的结果 特别是,我正在寻找: 类似于MultiMutate(data=data,va
MultiMutate(data=data,variables=c(values1,values2),lags=2)的函数
,它将从上面创建LagVal
的精确结果提前感谢您,如果您需要更多信息,请告诉我。如果有更简单的方法得到我想要的东西,那么我会洗耳恭听 您必须深入到tidyverse工具箱中,才能一次添加它们。如果为
cats
的每个值嵌套数据,则可以在嵌套的数据帧上迭代,在每个数据帧中的值*
列上迭代滞后
库(tidyverse)
种子(47)
df%嵌套(-cats)%%>%
突变(滞后=映射(数据、函数(dat)){
imap_dfc(dat[-1],~set_名称(map(1:2,滞后,x=.x)),
粘贴0(.y,_滞后,1:2)))
})) %>%
unest()%>%
安排(天)
#>#tibble:9 x 8
#>猫日值1值2值1\u lag1值1\u lag2值2\u lag1
#>
#>1234-7.娜娜娜
#>2B219。1.娜娜娜
#>3 C 3 17。17娜娜娜
#>4 A 4 15。2424NA-7。
#>5 B 5 16-1319NA 1。
#>6 C 6 12。1717NA 17。
#>7 A 7 12。27152424
#>8 B 8 16。151619. -13
#>9 C 9 15。36121717
#> # ... 还有1个变量:值2\u lag2
data.table::shift
将其矢量化,使其更简单。命名比实际滞后需要更多的工作:
库(data.table)
setDT(df)
df[,sapply(1:2,函数(x){paste0('values',x','u lag',1:2)}):=shift(.SD,1:2),
by=cats,.SDcols=values1:values2][]
#>天数CAT值1值2值1\u lag1值1\u lag2值2\u lag1
#>1:1A 24-7NA NA
#>2:2b191na-NA-NA
#>3:3 C 17 NA NA NA
#>4:4 A 15 24 NA-7
#>5:5B16-1319NA 1
#>6:6C1217 NA 17
#>7:7 A 12 27 15 24
#>8:8B161619-13
#>9:9C15361717
#>值2_lag2
#>1:NA
#>2:NA
#>3:NA
#>4:NA
#>5:NA
#>6:NA
#> 7: -7
#> 8: 1
#> 9: 17
在这些情况下,我依靠dplyr
和tidyr
的魔力:
library(dplyr)
library(tidyr)
set.seed(47)
# create data
s_data = data_frame(
days = 1:9,
cats = rep(c('A', 'B', 'C'), 3),
values1 = round(rnorm(9, 16, 4)),
values2 = round(rnorm(9, 16, 16))
)
max_lag = 2 # define max number of lags
# create lags
s_data %>%
gather(select = -c("days", "cats")) %>% # gather all variables that will be lagged
mutate(n_lag = list(0:max_lag)) %>% # add list-column with lag numbers
unnest() %>% # unnest the list column
arrange(cats, key, n_lag, days) %>% # order the data.frame
group_by(cats, key, n_lag) %>% # group by relevant variables
# create lag. when grouped by vars above, n_lag is a constant vector, take 1st value
mutate(lag_val = lag(value, n_lag[1])) %>%
ungroup() %>%
# create some fancy labels
mutate(var_name = ifelse(n_lag == 0, key, paste0("Lag", key, ".", n_lag))) %>%
select(-c(key, value, n_lag)) %>% # drop unnecesary data
spread(var_name, lag_val) %>% # spread your newly created variables
select(days, cats, starts_with("val"), starts_with("Lag")) # reorder
## # A tibble: 9 x 8
## days cats values1 values2 Lagvalues1.1 Lagvalues1.2 Lagvalues2.1 Lagvalues2.2
## <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 A 24. -7. NA NA NA NA
## 2 2 B 19. 1. NA NA NA NA
## 3 3 C 17. 17. NA NA NA NA
## 4 4 A 15. 24. 24. NA -7. NA
## 5 5 B 16. -13. 19. NA 1. NA
## 6 6 C 12. 17. 17. NA 17. NA
## 7 7 A 12. 27. 15. 24. 24. -7.
## 8 8 B 16. 15. 16. 19. -13. 1.
## 9 9 C 15. 36. 12. 17. 17. 17.
库(dplyr)
图书馆(tidyr)
种子(47)
#创建数据
s_数据=数据_帧(
天数=1:9,
猫=代表(c('A','B','c'),3),
值1=四舍五入(rnorm(9,16,4)),
值2=四舍五入(rnorm(9,16,16))
)
最大滞后=2#定义最大滞后数
#造成滞后
s_数据%>%
收集(选择=-c(“天”、“猫”))%>%#收集所有将滞后的变量
mutate(n_lag=list(0:max_lag))%>%#添加带有滞后编号的列表列
unest()%>%#取消列表列的测试
安排(猫、键、n_滞后、天数)%>%#对数据框进行排序
分组依据(猫、键、n_滞后)%>%#分组依据相关变量
#造成滞后。当按上述变量分组时,n_lag是一个常量向量,取第一个值
突变(滞后值=滞后(值,n滞后[1]))%>%
解组()%>%
#创建一些奇特的标签
变异(var_name=ifelse(n_lag==0,key,paste0(“lag”,key,“.”,n_lag)))%>%
选择(-c(键、值、n#lag))%>%#删除不必要的数据
排列(变量名,滞后值)%>%#排列新创建的变量
选择(天、猫、以(“val”)开头、以(“滞后”)开头)、重新排序
###tibble:9 x 8
##天数CAT值1值2滞后值1.1滞后值1.2滞后值2.1滞后值2.2
##
##1 A 24-7.娜娜娜娜
##2 B 19。1.娜娜娜娜
##3 C 17。17娜娜娜娜
##4 A 15。2424NA-7。NA
##5 B 16-1319NA 1。NA
##6 C 12。1717NA 17。NA
##7 A 12。27152424. -7.
##8 B 16。151619. -131.
##9 C 15。3612171717
hey@alistaire太好了。但是你介意解释一下你在这里做了什么疯狂的魔法吗_
MultiMutate = function(data, variables, lags){
# select the data to be working with
FuncData = data
# Loop through desired variables to mutate
for (i in variables){
# Loop through number of desired lags
for (u in 1:lags){
FuncData = FuncData %>% arrange(days) %>% group_by(cats) %>%
# Mutate new variable for desired number of lags. Give new variable a name with the lag number appended
mutate(paste(i, u) = lag(i, u))
}
}
FuncData
}
library(dplyr)
library(tidyr)
set.seed(47)
# create data
s_data = data_frame(
days = 1:9,
cats = rep(c('A', 'B', 'C'), 3),
values1 = round(rnorm(9, 16, 4)),
values2 = round(rnorm(9, 16, 16))
)
max_lag = 2 # define max number of lags
# create lags
s_data %>%
gather(select = -c("days", "cats")) %>% # gather all variables that will be lagged
mutate(n_lag = list(0:max_lag)) %>% # add list-column with lag numbers
unnest() %>% # unnest the list column
arrange(cats, key, n_lag, days) %>% # order the data.frame
group_by(cats, key, n_lag) %>% # group by relevant variables
# create lag. when grouped by vars above, n_lag is a constant vector, take 1st value
mutate(lag_val = lag(value, n_lag[1])) %>%
ungroup() %>%
# create some fancy labels
mutate(var_name = ifelse(n_lag == 0, key, paste0("Lag", key, ".", n_lag))) %>%
select(-c(key, value, n_lag)) %>% # drop unnecesary data
spread(var_name, lag_val) %>% # spread your newly created variables
select(days, cats, starts_with("val"), starts_with("Lag")) # reorder
## # A tibble: 9 x 8
## days cats values1 values2 Lagvalues1.1 Lagvalues1.2 Lagvalues2.1 Lagvalues2.2
## <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 A 24. -7. NA NA NA NA
## 2 2 B 19. 1. NA NA NA NA
## 3 3 C 17. 17. NA NA NA NA
## 4 4 A 15. 24. 24. NA -7. NA
## 5 5 B 16. -13. 19. NA 1. NA
## 6 6 C 12. 17. 17. NA 17. NA
## 7 7 A 12. 27. 15. 24. 24. -7.
## 8 8 B 16. 15. 16. 19. -13. 1.
## 9 9 C 15. 36. 12. 17. 17. 17.