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

Filling NA values using the populated values within subgroups

我有以下 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

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

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

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

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

预期结果:

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

使用data.table,我们将'data.frame'转换为'data.table'(setDT(df1)),按'name'分组,执行na.locf使用 na.rm=FALSE 在目的地上的正向方向,然后在反向模式 (fromLast=TRUE) 中再次执行此操作并将输出分配 (:=) 返回到同一列。

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

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

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

这将使用每个名称的目标的第一个非 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