2016-03-23 4 views
2

Ich habe folgendes data.frame:Füllung NA die besiedelten Werte innerhalb Subgruppen-Werte mit

name nav_status destination 
A  5   MUMBAI 
A  0   NA 
A  1   NA 
B  5   NA 
B  0   NEW YORK 
B  1   NA 

Ich beabsichtige, die NA-Werte mit dem Wert auf den Namen Spalte basierend aufzufüllen. Ich habe versucht:

  1. Auffüllen NA Werte mit dem letzten Beobachtungstechnik durch nach vorn, aber dann werden die Daten verzerrt. Ich benutzen das zoo Paket und die na.locf Syntax:

    NEW <- na.locf(FINAL, fromLast = TRUE)

  2. Ich habe versucht, auch eine separate Datei zu erstellen und dann gsub verwenden, aber es ist nicht generisch und eine separate Datei muss jedes Mal erstellt werden, wie Ich habe riesige Daten.

Erwartetes Ergebnis:

name nav_status destination 
A  5   MUMBAI 
A  0   MUMBAI 
A  1   MUMBAI 
B  5   NEW YORK 
B  0   NEW YORK 
B  1   NEW YORK 

Antwort

1

Mit data.table, wir wandeln die 'data.frame' auf 'data.table' (setDT(df1)), gruppiert nach 'name', tun die na.locf in der Vorwärts Richtung auf Ziel mit na.rm=FALSE und dann wieder im umgekehrten Modus (fromLast=TRUE) und zuweisen (:=) den Ausgang zurück in die gleiche Spalte.

library(zoo) 
library(data.table) 
setDT(df1)[, destination := na.locf(na.locf(destination, 
     na.rm=FALSE), fromLast=TRUE), by = name] 
df1 
# name nav_status destination 
#1: A   5  MUMBAI 
#2: A   0  MUMBAI 
#3: A   1  MUMBAI 
#4: B   5 NEW YORK 
#5: B   0 NEW YORK 
#6: B   1 NEW YORK 
1

Sie können dies tun mit dem dplyr Paket:

library(dplyr) 
dat %>% 
    group_by(name) %>% 
    mutate(destination = destination[which(!is.na(destination))][1]) 

Dies füllt die Zielspalte mit dem ersten nicht-NA-Wert von Ziel für jeden Namen.

name nav_status destination 
    (fctr)  (dbl)  (fctr) 
1  A   5  MUMBAI 
2  A   0  MUMBAI 
3  A   1  MUMBAI 
4  B   5 NEW YORK 
5  B   0 NEW YORK 
6  B   1 NEW YORK 
Verwandte Themen