2016-04-04 9 views
1

Ich habe einen Datensatz mit ID und als Bezeichner. Ich mag die Zeilen trennen, dass wir nicht den Vorjahresrekord, dh, ich will B von A finden:So finden Sie Datensätze basierend auf einer logischen Regel in R

A = 
ID Year x y 
1  2010 1 2 
1  2011 2 2 
1  2014 4 1 
2  2013 2 3 
2  2014 1 2 

B = 
ID Year x y 
1  2010 1 2 
1  2014 4 1 
2  2013 2 3 

ich, dass mit den folgenden if loop bekommen kann, aber ich bin sicher, dass es ein besserer Weg, es zu tun! Im folgenden Code sortiere ich zuerst A durch ID und Year, um den ersten Dateneintrag für jede ID zu erkennen.

B <- A_sort[1,] 
for(i in 2:nrow(A_sort)){ 
    if(A_sort$ID[i] != A_sort$ID[i-1]){ 
     B <- rbind(B,A_sort[i,]) 
    }else if(A_sort$Year[i] != A_sort$Year[i-1]+1){ 
     B <- rbind(B,A_sort[i,]) 
    } 
} 

Daten (Danke @ chinsoon12)

A <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L), Year = c(2010L, 2011L, 
    2014L, 2013L, 2014L), x = c(1L, 2L, 4L, 2L, 1L), y = c(2L, 2L, 
    1L, 3L, 2L)), .Names = c("ID", "Year", "x", "y"), class = "data.frame", row.names = c(NA, 
    -5L)) 
+1

'A [ave (A $ Year, A $ ID, FUN = function (x) c (0, diff (x)))! = 1,]' – rawr

Antwort

0

Verwendung diff die Jahre zwischen den Reihen zurückgeblieben zu berechnen? Dann ohne Rekord i.Vj diejenigen wählen

A <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L), Year = c(2010L, 2011L, 
    2014L, 2013L, 2014L), x = c(1L, 2L, 4L, 2L, 1L), y = c(2L, 2L, 
    1L, 3L, 2L)), .Names = c("ID", "Year", "x", "y"), class = "data.frame", row.names = c(NA, 
    -5L)) 

library(plyr) 
ddply(A[order(A$ID, A$Year),], .(ID), function(x) { 
    yearLag <- c(0,diff(x$Year)) 
    x[yearLag != 1, ] 
})