清除面板数据集中的缺失值

时间:2016-03-22 00:39:08

标签: r panel-data

我想整理一个面板数据,排除所有观察到的ID,这些ID在所有时段都没有有效的观察结果。

目前我有一个面板df,如:

dt <- data.frame(ID1=c(rep(520020,5),rep(520030,3),rep(520040,5),rep(520050,2),rep(520060,5)),
             ID2=c(rep(11,5),rep(12,3),14,15,rep(13,2),17,16,16,rep(14,4),20),
             t=c(rep(2014:2010,4)),
             var1=c(runif(n = 5, min = 1, max = 10),NA,NA,NA,runif(n = 12, min = 1, max = 10)),
             var2=c(runif(n = 17, min = 1, max = 10),NA,runif(n = 2, min = 1, max = 10)))

现在想要生成一个df,它只包含5年的完整观测值,ID1和ID2相同,没有任何缺失值。 在此示例中,这仅适用于组ID1 = 520020中的子组ID2 = 11.

有没有人有一个不能让我手动完成的解决方案?

1 个答案:

答案 0 :(得分:0)

为此,我已经遍历了每一对唯一的ID1和ID2。如果找到任何NA值,或者一对唯一的ID没有足够的行,或者存在除相关行之外的年份,则删除行。

请注意,此代码假定为&#34; year&#34;或&#34; t&#34;字段没有任何ID对的重复。

startYear <- 2010
endYear <- 2014

for( i in unique(dt$ID1)){
  for( j in unique(dt$ID2[dt$ID1 == i])){

    hasNA <- any(is.na(dt[dt$ID1 == i & dt$ID2 == j, ]))

    if(nrow(dt[dt$ID1 == i & dt$ID2 == j, ]) != (endYear - startYear + 1)){
      isIncomplete <- TRUE
    } else if ( !all(dt$t[dt$ID1 == i & dt$ID2 == j] %in% startYear:endYear) ) {
      isIncomplete <- TRUE 
    } else {
      isIncomplete <- FALSE
    }

    if( hasNA | isIncomplete ){
    dt <- dt[dt$ID1 != i | dt$ID2 != j, ]
    }
  }
}