我正在处理在特定年份停止并且之后不适用的数据。而且我需要根据其他变量的滞后值来计算变量的分配。我想找到一种方法来计算整个系列,而不是一年中的每个变量都是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的解决方案,因为在最终应用程序中我有多个相互链接的变量。
答案 0 :(得分:0)
建议的解决方案:
从第一个NA
开始,变量lags
,varA
和varB
的“递归” varC
等于这些变量的最后一个值变量。
因此,从这些初始变量开始,我们可以创建新变量:varA1
,varB1
和varC1
,在其中我们用最后一个值填充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)