【问题标题】:Select first non-NA value using R使用 R 选择第一个非 NA 值
【发布时间】:2021-01-12 13:56:55
【问题描述】:
df<-data.frame(ID = c(1,1,1,2,3,3,3),
          test = c(NA, 5.5, 6.4, NA, 7.3, NA, 10.9))

我想创建一个名为“value”的变量,它是每个单独 ID 的测试的第一个非 NA 值。对于只有 NA 的个人 ID 2,该值为 NA。

预期的输出是:

df<-data.frame(ID = c(1,1,1,2,3,3,3),
           test = c(NA, 5.5, 6.4, NA, 7.3, NA, 10.9),
           value = c(5.5, 5.5, 5.5, NA, 7.3, 7.3, 7.3))

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以在分组后的非NA元素上使用first

    library(dplyr)
    df <- df %>%
        group_by(ID) %>% 
        mutate(value = first(test[complete.cases(test)]))
    

    【讨论】:

      【解决方案2】:

      您可以使用ave 按ID 进行分组,并使用which.max 选择第一个非NA 值的[。

      df$value <- ave(df$test, df$ID, FUN=function(x) x[which.max(!is.na(x))])
      df
      #  ID test value
      #1  1   NA   5.5
      #2  1  5.5   5.5
      #3  1  6.4   5.5
      #4  2   NA    NA
      #5  3  7.3   7.3
      #6  3   NA   7.3
      #7  3 10.9   7.3
      

      【讨论】:

        【解决方案3】:

        这是一个data.table 选项,使用first + na.omit

        > setDT(df)[, value := first(na.omit(test)), ID][]
           ID test value
        1:  1   NA   5.5
        2:  1  5.5   5.5
        3:  1  6.4   5.5
        4:  2   NA    NA
        5:  3  7.3   7.3
        6:  3   NA   7.3
        7:  3 10.9   7.3
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-07
          • 2021-05-27
          • 1970-01-01
          • 2018-04-12
          • 2014-01-08
          • 1970-01-01
          • 2021-08-03
          • 1970-01-01
          相关资源
          最近更新 更多