2016-03-22 23 views
1

Tüm dönemler boyunca geçerli gözlemleri olmayan tüm gözlemlenen kimlikler hariç olmak üzere bir panel verisini düzenli hale getirmek istiyorum. panel veri kümesinden eksik değerleri temizleme

Şu anda böyle bir paneli df vardır:

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))) 

Şimdi eksik değerler olmadan aynı ID1 ve ID2'nin ile 5 yıllık yalnızca tam gözlemlerini içeren bir df oluşturmak istiyorum. Bu örnekte, bu yalnızca ID1 = 520020 grubundaki ID2 = 11 alt grubuna uygulanır.

Herkesin bunu elle yapmamı sağlayan bir çözümü var mı?

cevap

0

Bunun için her benzersiz ID1 ve ID2 çiftinin içinden geçtim. Herhangi bir NA değeri bulunduğunda veya benzersiz bir çift ID'nin yeterli satırı yoksa veya söz konusu olandan başka bir yılı yoksa, satırlar çıkarıldı. Bu kodun "yıl" veya "t" alanlarının herhangi bir kimlik çifti için kopyaları olmadığını varsaydığını unutmayın.

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, ] 
    } 
    } 
} 
İlgili konular