2016-12-11 1 views
2

Ich versuche, genau das zu tun, was der Benutzer in diesem Thread zu tun versuchen:Zeilen auswählen einen Datenrahmen basierend auf vorherigen Werten - eine bereitgestellte Lösung nicht funktioniert

Select specific rows based on previous row value (in the same column)

Die Grundidee ist, Wählen Sie alle Zeilen mit dem Wert 20 in der Spalte Typ, die unmittelbar einer Zeile mit einem Wert 40 in der Spalte Typ folgen. Das Endergebnis sollte ein Datenframe mit nur den Zeilen mit den Werten 20 oder 40 in der Spalte Typ sein.

Die Lösung zur Verfügung gestellt sieht wie folgt aus:

# Get indices of rows that meet condition 
ind2 <- which(df$Type==20 & dplyr::lag(df$Type)==40) 
# Get indices of rows before the ones that meet condition 
ind1 <- which(df$Type==20 & dplyr::lag(df$Type)==40)-1 

Dies funktioniert und ich kann sehen, dass die richtigen Zeilen ausgewählt wurden.

Aber der letzte Schritt, die Daten von subsetting

df[c(ind1,ind2)] 

eine Fehlermeldung zurück:

Error in `[.data.frame`(df, c(ind1, ind2)) : undefined columns selected 

ich kann nicht herausfinden, warum dies geschieht. Irgendwelche Ideen, um darüber zu kommen, würden sehr geschätzt werden!

+1

'df [c (ind1, ind2),]' vielleicht? – Abdou

Antwort

0

Wie richtig Abdou festgestellt: df[c(ind1,ind2)] ist unvollständig. Wenn Sie eine Matrix oder einen Datenrahmen verwenden, geben die eckigen Klammern folgendes an: [ rows , columns ].

In Ihrem Fall haben Sie für den Datenrahmen angegeben, eine Kombination von ind1 and ind2 auszuwählen, ohne zu sagen, dass sie entweder in den Zeilen oder Spalten aussehen soll. Als Folge haben Sie den Fehler bekommen. Spezifisch betrachtet R das Durchsuchen der Spalten basierend auf diesen ind1 und ind2 Spezifikationen.

Einfach klärt es als df[c(ind1,ind2),] Ihre df zeigt alle Zeilen, die die gewünschten Werte enthalten.

+0

Ihre Erklärung stimmt nicht wirklich. Das Indizieren eines data.frames mit nur einem Vektor zB 'df [c (ind1, ind2)]' wird nur als Indexierung für Spalten behandelt, was ein gültiger Code ist und solange funktioniert, wie diese Spalten existieren. (Im Gegensatz dazu würden Daten.tabellen dies als Indizierung nur in Zeilen behandeln, was der Fehler im Beispiel sein könnte) – ping

+0

Das ist richtig, ich habe es nur angezeigt, da er nur die Zeilen bekommen wollte. Deshalb habe ich gesagt, dass es unvollständig ist. Auch, da Spalten mit den Namen "ind1" und "ind2" in seinen Daten nicht existieren. –

+0

Ja, also Ihr mittlerer Abschnitt ist falsch/irreführend und würde besser entfernt werden, um Verwirrung zu vermeiden. Der Code sagt, dass man in Spalten suchen soll (nicht, wie Sie es vorschlagen), und R schaut nicht zuerst in Zeilen, wie Sie vorschlagen - es sucht überhaupt nicht in Zeilen. – ping

Verwandte Themen