Füllen Sie den Datenrahmen mit Werten aus den Zeilen darüber

10

Angenommen, ich habe einen Datenrahmen wie folgt:

%Vor%

Also wird VALUE nur einmal pro ID auf FIRST = TRUE gesetzt. ID_2 kann zwischen IDs duplizieren, muss aber nicht.

Wie gebe ich die Zahlen aus den ersten Zeilen jeder ID in alle Zeilen dieser ID ein, so dass die Spalte VALUE zu 2, 2, 2, 5, 5 wird?

Ich weiß, ich könnte einfach alle IDs mit einer for-Schleife durchlaufen, aber ich suche nach einem effizienteren Weg.

    
Nils 11.05.2012, 15:53
quelle

4 Antworten

17

Wenn Sie nur die Werte aus der Spalte VALUE weiterleiten müssen, dann können Sie na.lofc() function aus dem Paket zoo verwenden. Hier ist ein Beispiel:

%Vor%     
Joy 11.05.2012, 16:01
quelle
20

Die Frage fragt nach Effizienz im Vergleich zu einer Schleife. Hier ist ein Vergleich von vier Lösungen:

  1. zoo::na.locf , wodurch eine Paketabhängigkeit eingeführt wird, und obwohl es viele Kantenfälle behandelt, müssen die 'leeren' Werte NA sein. Die anderen Lösungen lassen sich leicht an Nicht-NA-Rohlinge anpassen.

  2. Eine einfache Schleife in der Basis R.

  3. Eine rekursive Funktion in der Basis R.

  4. Meine eigene vektorisierte Lösung in Base R.

  5. Die neue Funktion fill() in tidyr version 0.3.0., die auf data.frames funktioniert.

Beachten Sie, dass die meisten dieser Lösungen für Vektoren und nicht für Datenrahmen gedacht sind, sodass sie keine ID-Spalte überprüfen. Wenn der Datenrahmen nicht nach ID gruppiert ist und der zu füllende Wert an der Spitze jeder Gruppe liegt, können Sie eine Fensterfunktion in dplyr oder data.table

ausprobieren %Vor%

Ergebnisse:

%Vor%     
nacnudus 12.09.2015 07:51
quelle
4

Wenn der Wert für eine bestimmte ID immer im ersten Datensatz erscheint, was für Ihre Daten der Fall zu sein scheint, können Sie match verwenden, um diesen Datensatz zu finden:

%Vor%     
flodel 11.05.2012 16:03
quelle
0

+1 für @nacnudus Griffe führende Leerzeichen

%Vor%     
Jordan 26.01.2017 10:06
quelle

Tags und Links