2017-02-24 2 views
2

In einem Datenrahmen, nach einigen Berechnungen, wird alle Zeilen mit einer Reihe von 0 enden, wie sie in dem (Teil-) Beispiel unten:Finden ersten Spalts mit bestimmten Eigenschaft

X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 
1 -9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
2 4 -1 1 -1 0 -1 0 0 0 0 0 0 0 0 0 
3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
5 -3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
6 -6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
7 4 -4 1 -1 0 -1 0 0 0 0 0 0 0 0 0 
8 3 -3 0 0 0 0 0 0 0 0 0 0 0 0 0 
9 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
11 -3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

Aber:
- etwas isoliert 0 kann auftreten vor der Start der Reihe von 0, wie in den Zeilen 2 und 7
- einige Zeilen sind komplett aus 0, wie in den Zeilen 4 und 10
Ich möchte eine neue Spalte mit den folgenden erstellen Information:
"in welcher Spalte die Serie s von 0 Start? "

2, 7, 2, 1, 2, 2, 7, 3, 2, 1, 2 

Ich kann nicht herausfinden, wie dies zu tun ... Dank für jeden Hinweis:
Aus dem obigen Beispiel, ist diese neue Spalte der Zahlen enthalten soll.

Antwort

0

Hier ist eine einfache Lösung. Wahrscheinlich gibt es raffiniertere, aber es funktioniert. Angenommen die Matrix wird ‚x‘ genannt

# make new colum and fill with zeros 
x[,ncol(x)+1] <- 0 

#loop through rows and note first instance of zero in new column 
for(i in 1:nrow(x)){ 
    x[i,ncol(x)] <- grep(0, x[i,])[1] 
} 
1

Verwenden apply zu rle auf jeder Zeile laufen und den ersten Index, wo der Wert gleich null ist und die Länge größer als 1 ist (Beginn der Serie).

apply(df, 1, function(x) which(rle(x)$values == 0 & rle(x)$lengths > 1)[1]) 
# [1] 2 7 2 1 2 2 7 3 2 1 2 

Daten

df = structure(list(X1 = c(-9L, 4L, 3L, 0L, -3L, -6L, 4L, 3L, 3L, 
0L, -3L), X2 = c(0L, -1L, 0L, 0L, 0L, 0L, -4L, -3L, 0L, 0L, 0L 
), X3 = c(0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L), X4 = c(0L, 
-1L, 0L, 0L, 0L, 0L, -1L, 0L, 0L, 0L, 0L), X5 = c(0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X6 = c(0L, -1L, 0L, 0L, 0L, 
0L, -1L, 0L, 0L, 0L, 0L), X7 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L), X8 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L), X9 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X10 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X11 = c(0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X12 = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L), X13 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L), X14 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L), X15 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("X1", 
"X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10", "X11", 
"X12", "X13", "X14", "X15"), class = "data.frame", row.names = c(NA, 
-11L)) 
+0

Läuft perfekt! Danke vielmals. – Andrew

Verwandte Themen