r - 在R中填充缺失值时间序列数据

标签 r time-series dplyr zoo missing-data

我正在尝试将面板数据中的年度值扩展到年季度值。即每个季度重复年度值。 例如,我希望获得年度季度 2000Q1、2000Q2、2000Q3、2000Q4、2001Q1、...、2001Q4 的收入重复值。因此数据框将是 id、year-quarter、invenue。

我使用两步方法,但有一些问题需要处理。如果缺少季度起始值,那么我也需要缺少季度起始值(NA)。

案例1:

annual_data <- data.frame(
person=c(1, 1, 1, 2, 2,2),
year=c(2010, 2011, 2012, 2010, 2011, 2012),
income=c(4, 10, 13, 1, NA, 30)
)

案例2:

annual_data <- data.frame(
person=c(1, 1, 1, 2, 2,2),
year=c(2010, 2011, 2012, 2010, 2011, 2012),
income=c(4, 10, 13, NA, NA, 30)
)

在第一步中,我将数据扩展到季度,如上所述: interpolating in R yearly time series data with quarterly values

因此使用如下函数:

expand <- function(x) {
    years <- min(x$year):max(x$year)
    quarters <- 1:4
    grid <- expand.grid(quarter=quarters, year=years)
    x$quarter <- 1
    merged <- grid %>% left_join(x, by=c('year', 'quarter'))
    merged$person <- x$person[1]
    return(merged)
   }

然后我用在

    zoo::na.locf 

    dplyr::mutate.

quarterlydata <- annual_data %>% group_by(person) %>% do(expand(.))
testdata <- quarterlydata %>% group_by(person) %>% mutate(ynew=zoo::na.locf(y))

但是运气不太好,因为它从以前的非缺失值复制到所有缺失值。也就是说,

情况 1:它复制所有值,因此人 2 的收入 1 被复制到 2010 年和 2011 年。当必须复制到 2010 年时,2011 年应该是 NA。

对于情况 2:我得到

 Error: incompatible size (%d), expecting %d (the group size) or 1.

对我缺少的地方有什么想法吗?

最佳答案

对于情况 1,您缺少 group_by 中的年份。由于使用您拥有的代码,na.locf 的分组认为 yearna.locf 必须运行的分组的一部分.

testdata <- quarterlydata %>% 
  group_by(person, year) %>% 
  mutate(ynew=zoo::na.locf(income, na.rm=FALSE))

输出:

> tail(testdata, 13)
Source: local data frame [13 x 5]
Groups: person, year

   quarter year person income ynew
1        4 2012      1     NA   13
2        1 2010      2      1    1
3        2 2010      2     NA    1
4        3 2010      2     NA    1
5        4 2010      2     NA    1
6        1 2011      2     NA   NA
7        2 2011      2     NA   NA
8        3 2011      2     NA   NA
9        4 2011      2     NA   NA
10       1 2012      2     30   30
11       2 2012      2     NA   30
12       3 2012      2     NA   30
13       4 2012      2     NA   30

对于情况 2,您可能已经从上面的代码推断出,您必须将 na.rm 设置为 FALSE,否则向量将丢弃所有 NA 无法推断。

因此,对于情况 2 使用完全相同的代码,我们将得到输出:

> tail(testdata, 13)
Source: local data frame [13 x 5]
Groups: person, year

   quarter year person income ynew
1        4 2012      1     NA   13
2        1 2010      2     NA   NA
3        2 2010      2     NA   NA
4        3 2010      2     NA   NA
5        4 2010      2     NA   NA
6        1 2011      2     NA   NA
7        2 2011      2     NA   NA
8        3 2011      2     NA   NA
9        4 2011      2     NA   NA
10       1 2012      2     30   30
11       2 2012      2     NA   30
12       3 2012      2     NA   30
13       4 2012      2     NA   30

关于r - 在R中填充缺失值时间序列数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32445856/

相关文章:

r - 如何使用 wrap 函数在 GGally::ggpairs 中使用黄土方法

r - 将每日和定期数据合并到一个数据框中

r - 你可以使用 R 中的 ar 函数拟合非平稳模型吗

python - 如何在 Python 3 中读取 edf 数据

r - Dplyr 多重滞后整洁评估?

r - 合并两个数据帧,但表示两个数据帧中都存在的列

r - 错误 : Problem with `mutate()` column (. ..) 必须是大小 15 或 1,而不是 17192

r - 如何在 r 中落后 Quarters?

r - 与来自 R 的 SAS 数据集通信

r - 自动重新计算和同步数据框中的计算列