Ersetze NA durch vorheriges Auftreten

8

Dies ist ein Beispiel meiner Daten aus CSV. Es enthält ~ 10 Spalten.

%Vor%

Ich möchte NAs in Zeile 4 und 5 mit 10 bzw. 11 füllen (da das Produktgewicht von A und C bereits aus Zeile 1 und 3 bekannt ist). Ich möchte, dass der endgültige Datenrahmen so ist

%Vor%

Was ist der beste Weg, dies in R zu tun?

    
Avis 09.06.2016, 17:00
quelle

3 Antworten

5

Eine weitere Option mit dplyr und tidyr :

%Vor%

Das Ergebnis ist jedoch nach Product_id sortiert.

    
Psidom 09.06.2016, 17:17
quelle
9

Obwohl die Frage nach dem "vorherigen Ereignis" den Nachteil hätte, dass, wenn das erste Product_Weight in irgendeinem Product_id NA wäre, es nicht ausgefüllt werden könnte, selbst wenn wir das Product_Weight von kennen würden ein nachfolgendes Product_id , also verwenden wir anstelle des vorherigen Vorkommens den Mittelwert aller Nicht-NAs mit demselben Product_id . Da diese alle gleich sein sollten, ist ihr Mittelwert ihr gemeinsamer Wert.

Wenn Sie das vorherige Vorkommen wirklich wollen, benutzen Sie die Prev Funktion wo:

%Vor%

anstelle von na.aggregate in (1) und (3) und nicht (2).

Die folgenden Lösungen haben die Vorteile, dass sie alle:

  • bewahrt die Reihenfolge der Eingabe

  • funktioniert auch dann, wenn das erste Product_Weight in einem Product_id NA ist

  • ändert die Eingabe nicht

Die erste Lösung hat den zusätzlichen Vorteil, dass sie nur eine Codezeile (plus eine library -Anweisung) enthält und die zweite Lösung den zusätzlichen Vorteil hat, keine Pakete zu verwenden.

1) zoo :: na.aggregate Wir verwenden na.aggregate im Zoo-Paket (das alle NAs durch den Durchschnitt der Nicht-NAs ersetzt) ​​und wir wenden es separat auf Product_Weight an für jedes Product_id .

%Vor%

geben:

%Vor%

2) Keine Pakete Alternativ Mean anstelle von na.aggregate verwenden, wobei Mean wie folgt definiert ist:

%Vor%

3) dplyr / zoo Fügen Sie Zeilennummern hinzu, gruppieren Sie nach Product_id , füllen Sie die NAs wie in den vorherigen Lösungen mit na.aggregate wie unten gezeigt oder Mean , ordnen Sie sie zurück in die ursprüngliche Reihenfolge und entfernen Sie die Zeilennummern:

%Vor%

Hinweis: Dies wurde für die Eingabe DF :

verwendet %Vor%     
G. Grothendieck 09.06.2016 17:15
quelle
2

Hier ist eine Lösung mit Basis-R-Befehlen:

%Vor%

Wahrscheinlich nicht so effizient wie die oben erwähnte dplyr / tidyr-Lösung.

    
Dave2e 09.06.2016 18:01
quelle

Tags und Links