填写缺失值R

时间:2015-09-07 20:47:50

标签: r time-series dplyr zoo missing-data

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

我使用两步法但有一些问题需要处理。如果缺少季度起始值,那么我将需要季度缺失(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年应该是NAs。

案例2:我得到了

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

有关我失踪的地方的任何想法?

1 个答案:

答案 0 :(得分:2)

对于案例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