【问题标题】:Filling NA values using the populated values within subgroups使用子组中的填充值填充 NA 值
【发布时间】:2016-03-23 16:53:15
【问题描述】:

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

【问题讨论】:

    标签: r na missing-data


    【解决方案1】:

    使用data.table,我们将“data.frame”转换为“data.table”(setDT(df1)),按“名称”分组,使用na.rm=FALSE在目标上执行na.locf,然后然后以反向模式 (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
    

    【讨论】:

      【解决方案2】:

      您可以使用 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        相关资源
        最近更新 更多