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

clean missing values from panel dataset

我想整理一个面板数据,排除所有观察到的 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。

有没有人有不让我手动执行此操作的解决方案?

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

请记住,此代码假定 "year" 或 "t" 字段没有任何 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, ]
    }
  }
}