基于 r 中标志列的面板数据插值
Interpolation of panel data based on a flag column in r
我有一个时间序列面板数据集,其结构如下:
df <- data.frame(
year = c(2012L, 2013L, 2014L, 2012L, 2013L, 2014L),
id = c(1L, 1L, 1L, 2L, 2L, 2L),
c = c(11L, 13L, 13L, 16L, 15L, 15L),
flag = c(FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)
)
#> year id c flag
#> 1 2012 1 11 FALSE
#> 2 2013 1 26 TRUE
#> 3 2014 1 13 FALSE
#> 4 2012 2 16 FALSE
#> 5 2013 2 15 FALSE
#> 6 2014 2 19 FALSE
我想做一个线性插值,只要标志列中有相应的 TRUE 值,c 列中的值就会通过对其前后的值进行平均来插值。例如因为值 26 有一个 TRUE 标志,我希望它被替换为 11 和 13 的平均值,即 12。
我尝试编写一个函数,但在面板数据设置中无法正确实现它。
我想到的一个选项是使用子集 ?stats::filter
,它本质上是一个移动平均线,基于将两边的值乘以 0.5,并将当前值乘以 0。
df$c[df$flag] <- stats::filter(df$c, c(0.5,0,0.5))[df$flag]
df
# year id c flag
#1 2012 1 11 FALSE
#2 2013 1 12 TRUE
#3 2014 1 13 FALSE
#4 2012 2 16 FALSE
#5 2013 2 15 FALSE
#6 2014 2 15 FALSE
您可以 replace
c
值,其中 flag
是 TRUE
和 NA
,然后用 na.approx
从 [=17] 插入值=].
library(dplyr)
df %>% mutate(c = zoo::na.approx(replace(c, flag, NA)))
# year id c flag
#1 2012 1 11 FALSE
#2 2013 1 12 TRUE
#3 2014 1 13 FALSE
#4 2012 2 16 FALSE
#5 2013 2 15 FALSE
#6 2014 2 15 FALSE
我有一个时间序列面板数据集,其结构如下:
df <- data.frame(
year = c(2012L, 2013L, 2014L, 2012L, 2013L, 2014L),
id = c(1L, 1L, 1L, 2L, 2L, 2L),
c = c(11L, 13L, 13L, 16L, 15L, 15L),
flag = c(FALSE, TRUE, FALSE, FALSE, FALSE, FALSE)
)
#> year id c flag
#> 1 2012 1 11 FALSE
#> 2 2013 1 26 TRUE
#> 3 2014 1 13 FALSE
#> 4 2012 2 16 FALSE
#> 5 2013 2 15 FALSE
#> 6 2014 2 19 FALSE
我想做一个线性插值,只要标志列中有相应的 TRUE 值,c 列中的值就会通过对其前后的值进行平均来插值。例如因为值 26 有一个 TRUE 标志,我希望它被替换为 11 和 13 的平均值,即 12。 我尝试编写一个函数,但在面板数据设置中无法正确实现它。
我想到的一个选项是使用子集 ?stats::filter
,它本质上是一个移动平均线,基于将两边的值乘以 0.5,并将当前值乘以 0。
df$c[df$flag] <- stats::filter(df$c, c(0.5,0,0.5))[df$flag]
df
# year id c flag
#1 2012 1 11 FALSE
#2 2013 1 12 TRUE
#3 2014 1 13 FALSE
#4 2012 2 16 FALSE
#5 2013 2 15 FALSE
#6 2014 2 15 FALSE
您可以 replace
c
值,其中 flag
是 TRUE
和 NA
,然后用 na.approx
从 [=17] 插入值=].
library(dplyr)
df %>% mutate(c = zoo::na.approx(replace(c, flag, NA)))
# year id c flag
#1 2012 1 11 FALSE
#2 2013 1 12 TRUE
#3 2014 1 13 FALSE
#4 2012 2 16 FALSE
#5 2013 2 15 FALSE
#6 2014 2 15 FALSE