【问题标题】:Time series function in dplyrdplyr 中的时间序列函数
【发布时间】:2018-12-10 09:34:20
【问题描述】:

我正在处理在特定年份停止并且之后为 NA 的数据。我需要根据其他变量的滞后值来计算变量的分配。我想找到一种方法来计算整个系列,而不是在其中一个变量为 NA 时每年计算一次。我正在查看 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,因为在最终应用程序中我有多个相互链接的变量。

【问题讨论】:

    标签: r dplyr panel-data


    【解决方案1】:

    建议的解决方案:

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

    因此,从这些初始变量开始,我们可以创建新变量:varA1varB1varC1,其中我们用最后一个值填充 NAs,通过 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)
    

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多