【问题标题】:Interpolation of panel data based on a flag column in r [duplicate]基于r中的标志列插值面板数据[重复]
【发布时间】:2020-08-03 03:35:53
【问题描述】:

我有一个时间序列面板数据集,其结构如下:

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。 我尝试编写一个函数,但在面板数据设置中正确实现它有点麻烦。

【问题讨论】:

    标签: r dplyr interpolation panel


    【解决方案1】:

    您可以使用 replace c 值,其中 flagTRUENA,然后使用来自 zoona.approx 插入值。

    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
    

    【讨论】:

    • 非常感谢!将 c 列中带有 TRUE 标志的值替换为 NA 的最简单方法是什么?
    • 我已经使用上面的replace 语句做到了这一点。你也可以df$c[df$flag] &lt;- NA
    【解决方案2】:

    想到的一个选项是使用子集?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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-22
      • 2017-08-05
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      相关资源
      最近更新 更多