2016-03-21 6 views
1

Ich habe eine Frage bezüglich der na.locf Funktion im zoo Paket. Innerhalb des Datenrahmens unten möchte ich die führenden NAs (für Jahre 1987, 1988) entfernen, aber diejenigen mit einem gültigen Wert für das vorherige Jahr (1993) behalten.na.locf entfernen führende NAs, halten andere

Year  X 
1987  NA 
1988  NA 
1989  2 
1990  5 
1991  9 
1992  16 
1993  NA 
1994  27 
1995  36 

Hat jemand eine Lösung für dieses Problem?

+0

Wenn 1 986 ist nicht NA, würdest du 1987 behalten? – zx8754

Antwort

3

Die na.locf dient zum Ausfüllen fehlender Beobachtungen, nicht zum Entfernen. Das Zoo-Paket hat auch eine na.trim Funktion, die führenden und/oder nachfolgende Beobachtungen entfernt:

na.trim(mydf) 

die gibt:

> na.trim(mydf) 
    Year X 
3 1989 2 
4 1990 5 
5 1991 9 
6 1992 16 
7 1993 NA 
8 1994 27 
9 1995 36 

Mit den sides Parametern können Sie wählen, ob nur zu entfernen, am Anfang oder Ende fehlen Beobachtungen oder beides. Unter Verwendung zum Beispiel sides = 'right' nur entfernen fehlende Beobachtungen Hinter und hält die führenden fehlenden Beobachtungen:

> na.trim(mydf, sides = 'right') 
    Year X 
1 1987 NA 
2 1988 NA 
3 1989 2 
4 1990 5 
5 1991 9 
6 1992 16 
7 1993 NA 
8 1994 27 
9 1995 36 

Folglich sides = 'left' verwendet, wird führende fehlende Beobachtungen nur entfernen und halten Sie die Hinter fehlenden Beobachtungen:

> na.trim(mydf, sides = 'left') 
    Year X 
3 1989 2 
4 1990 5 
5 1991 9 
6 1992 16 
7 1993 NA 
8 1994 27 
9 1995 36 
10 1996 NA 

Verwendete Daten:

mydf <- structure(list(Year = 1987:1996, X = c(NA, NA, 2L, 5L, 9L, 16L, NA, 27L, 36L, NA)), 
        .Names = c("Year", "X"), class = "data.frame", row.names = c(NA,-10L)) 
0

Angenommen, der Name Ihres Datenrahmens lautet "df".

konvertieren alle NA s in eine Zahl, die ungültig ist, sagen -1

df$X[is.na(df$X)] <- -1 

nun eine Lauflängencodierung zu tun und die Beobachtungen entfernen, wo Lauflänge von -1s sind größer als 1

rle(df$X) 
Run Length Encoding 
    lengths: int [1:5] 2 1 1 ... 
    values : num [1:5] -1 2 5 ... 
df$runs <- rep(rle(df$X)$lengths,rle(df$X)$lengths) 

data2 <- df[!(df$X==-1 & df$runs > 1) , ] 
+0

Nun ist es klar, ich glaube –

+0

@DavidArenburg die Frage Staaten müssen wir halten die NA s nicht von NA voraus, aber wir können NAs von Werten umgeben –

+0

Vielleicht hast du Recht, weiß ich nicht. Nicht sicher, warum OP dann "führend" sagt. Diese Frage scheint mir unklar. –

Verwandte Themen