【问题标题】:Replace NA with values in another row of same column for each group in r将 NA 替换为 r 中每个组的同一列另一行中的值
【发布时间】:2015-08-07 13:50:38
【问题描述】:

对于每个组的给定列,我需要将每行的 NA 替换为不同行的非 NA 值

假设示例数据如下:

id   name
 1     a
 1     NA
 2     b
 3     NA
 3     c
 3     NA

想要的输出:

id   name
 1     a
 1     a
 2     b
 3     c
 3     c
 3     c

有没有办法在 r 中执行此操作?

【问题讨论】:

  • 如果每个id 总是至少有一个非NA,你可以使用任何last-observation-carried-forward 函数,例如zoo 中的一个:zoo::na.locf(df1[with(df1, order(id, name)), ]) 使用@ akruns 数据

标签: r


【解决方案1】:

这是一种使用dplyr 的方法。从数据框x 中,我们按id 分组,并将NA 替换为相关值。我假设每个id 有一个唯一值name

x <- data.frame(id = c(1, 1, 2, rep(3,3)), 
 name = c("a", NA, "b", NA, "c", NA), stringsAsFactors=F)

require(dplyr)
x %>%
  group_by(id) %>%
  mutate(name = unique(name[!is.na(name)]))

Source: local data frame [6 x 2]
Groups: id

#  id name
#1  1    a
#2  1    a
#3  2    b
#4  3    c
#5  3    c
#6  3    c

【讨论】:

    【解决方案2】:

    我们可以使用data.table 来执行此操作。将“data.frame”转换为“data.table”(setDT(df1))。按 'id' 分组,我们将 'name' 替换为 'name' 中的非 NA 值。

    library(data.table)#v1.9.5+
    setDT(df1)[, name:= name[!is.na(name)][1L] , by = id]
    df1
    #   id name
    #1:  1    a
    #2:  1    a
    #3:  2    b
    #4:  3    c
    #5:  3    c
    #6:  3    c
    

    注意:这里我假设每个“id”组中只有一个唯一的非 NA 值。

    或者另一种选择是将数据集与unique 之后的数据行连接起来order by 'id' 和 'name'。

     setDT(df1)
     df1[unique(df1[order(id, name)], by='id'), on='id', name:= i.name][]
     #   id name
     #1:  1    a
     #2:  1    a
     #3:  2    b
     #4:  3    c
     #5:  3    c
     #6:  3    c
    

    注意:on 仅适用于 data.table 的开发版本。安装devel版本的说明是here

    数据

    df1 <- structure(list(id = c(1L, 1L, 2L, 3L, 3L, 3L), name = c("a", 
    NA, "b", NA, "c", NA)), .Names = c("id", "name"),
    class = "data.frame",    row.names = c(NA, -6L))
    

    【讨论】:

      【解决方案3】:

      基础R

      d<-na.omit(df)
      transform(df,name=d$name[match(id,d$id)])
      

      再次假设每个 id 有一个唯一的 name 值(强制它)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        • 2021-07-29
        • 2021-12-09
        • 2020-05-18
        相关资源
        最近更新 更多