使用子组内的填充值填充NA值

时间:2016-03-23 16:53:16

标签: r na missing-data

我有以下data.frame:

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

我打算用基于name列的值填充NA值。 我试过了:

  1. 使用上次观察结果技术填充NA值,但数据会失真。我使用了zoo包和na.locf语法:

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

  2. 我还尝试创建一个单独的文件,然后使用gsub,但它不是通用的,每次因为我有大量数据时都必须创建一个单独的文件。

    < / LI>

    预期结果:

    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
    

2 个答案:

答案 0 :(得分:1)

使用data.table,我们会转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1))按名称&#39;分组,使用na.locf在目的地的前进方向上执行na.rm=FALSE,然后以反向模式再次执行此操作fromLast=TRUE 1}})并将输出(:=)分配回同一列。

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 :(得分:1)

您可以使用dplyr包执行此操作:

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

这将使用每个名称的第一个非NA NA值填充目标列。

    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