2016-03-23 29 views
2

içinde doldurulan değerler kullanılarak değerleri aşağıdaki data.frame vardır:Dolgu NA alt

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

CY adı sütunu temel değer ile değerleri doldurmak niyetinde. denedim:

  1. tekniğini Taşınan ama sonra veri bozulmuyor son gözlem ile NA değerleri Dolum. Ben zoo paketi ve na.locf sözdizimi kullanılır: Ben de ayrı bir dosya oluşturmak ve sonra gsub kullanmaya çalıştı

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

  2. ama jenerik değildir ve ayrı bir dosya her zaman olduğu gibi oluşturulan gerekecektir Çok fazla veri var.

Beklenen sonuç:

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 

cevap

1

data.table ile, 'adı' göre gruplandırılmış (setDT(df1)) 'data.table' için 'data.frame' dönüştürmek, ileriye na.locf yapmak na.rm=FALSE ile varış yerindeki yönü izleyin ve sonra bunu ters modda (fromLast=TRUE) tekrar yapın ve çıkışı (:=) aynı sütuna geri atayın.

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

Sen dplyr paketi ile yapabilirsiniz:

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

Bu, her isim için hedef olmayan ilk NA değeri ile hedef sütununu doldurur.

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