dplyr中的时间序列函数

时间:2018-12-10 09:34:21

标签: r dplyr panel-data

我正在处理在特定年份停止并且之后不适用的数据。而且我需要根据其他变量的滞后值来计算变量的分配。我想找到一种方法来计算整个系列,而不是一年中的每个变量都是NA。鉴于我正在使用dplyr,因此我正在查看dplyr,因此需要按ID将其分组。

我提供以下示例:

set.seed(1)
df <- data.frame( year = c(seq(2000, 2018), seq(2000, 2018)) , id = c(rep(1, 19),rep(2, 19)), varA = floor(rnorm(38)*100), varB= floor(rnorm(38)*100), varC= floor(rnorm(38)*100))

df <- df %>% mutate(varA = if_else(year>2010, as.double(NA) , varA) , 
                    varB = if_else(year>2010, as.double(NA) , varB),
                    varC = if_else(year>2010, as.double(NA) , varC))  %>% group_by(id) %>% arrange(year)

我想找到一种计算变量的方法,该变量在变量C可用时相等,但之后等于基于变量C,B和A的滞后值的公式。执行代码时下面,鉴于滞后仅适用一年,因此varResult和D仅计算一年:

df <- df %>% mutate( varD = lag(varA)*lag(varB), 
                     varRESULT = if_else(is.na(varC), lag(varC, 1)/lag(varD, 2)*lag(varD, 1), varC))

但是我想找到一种方法来立即计算整个序列(考虑到数据的面板尺寸),而不是重复执行7次代码。最好是一个可以从varResults分别计算varD的解决方案,因为在最终应用程序中我有多个相互链接的变量。

1 个答案:

答案 0 :(得分:0)

建议的解决方案:

从第一个NA开始,变量lagsvarAvarB的“递归” varC等于这些变量的最后一个值变量。

因此,从这些初始变量开始,我们可以创建新变量:varA1varB1varC1,在其中我们用最后一个值填充NA s,由id

library(dplyr)
library(tidyr) # for the function `fill`

df <- df %>% 
mutate(varA1 = varA, varB1 = varB, varC1 = varC) %>% 
group_by(id) %>%
arrange(year) %>%
fill(varA1, varB1, varC1) # fills with last value

然后,我们应用公式:

df <- df %>% 
mutate( varD = lag(varA1)*lag(varB1), 
varRESULT = if_else(is.na(varC), lag(varC1, 1)/lag(varD, 2)*lag(varD, 1), varC)) %>% 
select(-varA1, -varB1, -varC1)