首页 文章

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

提问于
浏览
1

我正在尝试将我的面板数据中的年度值扩展到年度季度值 . 这是每个季度重复的年度值 . 例如,我希望获得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:它复制了所有 Value ,因此第2人的收入1被复制到2010年和2011年 . 当必须复制到2010年时,2011年应该是NAs .

案例2:我明白了

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

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

1 回答

  • 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
    

相关问题