【问题标题】:Replace a value NA with the value from another column in R用 R 中另一列的值替换值 NA
【发布时间】:2016-03-08 09:56:10
【问题描述】:

我想根据列年份的年份将 A 列中 dfABy 中的 NA 值替换为 B 列中的值。比如我的df是:

                 >dfABy 
                 A    B   Year
                 56   75  1921
                 NA   45  1921
                 NA   77  1922
                 67   41  1923
                 NA   65  1923

我要参加的结果是:

                 > dfABy
                 A    B   Year
                 56   75  1921
                *45*  45  1921
                *77*  77  1922
                 67   41  1923
                *65*  65  1923

P.S: 用 * 替换列 A 中每年 B 列中的值

【问题讨论】:

标签: r replace na


【解决方案1】:

也许 R 词典中最容易阅读/理解的答案是使用 ifelse。因此,我们可以借用 Richard 的数据框:

df <- structure(list(A = c(56L, NA, NA, 67L, NA),
                     B = c(75L, 45L, 77L, 41L, 65L),
                     Year = c(1921L, 1921L, 1922L, 1923L, 1923L)),.Names = c("A", 
                                                                                                                            "B", "Year"), class = "data.frame", row.names = c(NA, -5L))
df$A <- ifelse(is.na(df$A), df$B, df$A)

【讨论】:

    【解决方案2】:

    现在根据@Max 进行更正。 (最初与初始实施一起使用)

    新的 dplyr 函数 coalesce 可以真正简化这些情况。

    library(dplyr)
    
    dfABy %>% 
        mutate(A = coalesce(A,B))
    

    【讨论】:

    • 不起作用,但其他答案已纠正
    • 现在更正了——确实我们不应该留下过时的答案
    【解决方案3】:

    GGAnderson 提供的解决方案确实返回了错误消息。但是在 mutate() 中使用它效果很好。

    df <- structure(list(A = c(56L, NA, NA, 67L, NA),
                         B = c(75L, 45L, 77L, 41L, 65L),
                         Year = c(1921L, 1921L, 1922L, 1923L, 1923L)),
                    .Names = c("A", "B", "Year"), 
                    class = "data.frame", 
                    row.names = c(NA, -5L))
    df
    df%>% 
      coalesce(A,B) #returns error
    
    df %>%
    mutate(A = coalesce(A,B)) #works
    

    (我是 Stackoverflow 的新手;我的低声誉不允许直接评论 GGAnderson 的回答)

    【讨论】:

      【解决方案4】:

      您可以使用[&lt;- 的简单替换,将NA 元素设置为子集。

      df$A[is.na(df$A)] <- df$B[is.na(df$A)]
      

      或者,within()

      within(df, A[is.na(A)] <- B[is.na(A)])
      

      两个都给

         A  B Year
      1 56 75 1921
      2 45 45 1921
      3 77 77 1922
      4 67 41 1923
      5 65 65 1923
      

      数据:

      df <- structure(list(A = c(56L, NA, NA, 67L, NA), B = c(75L, 45L, 77L, 
      41L, 65L), Year = c(1921L, 1921L, 1922L, 1923L, 1923L)), .Names = c("A", 
      "B", "Year"), class = "data.frame", row.names = c(NA, -5L))
      

      【讨论】:

        【解决方案5】:

        简单

        library(dplyr)
        
        dfABy %>%
          mutate(A_new = 
                   A %>% 
                     is.na %>%
                     ifelse(B, A) )
        

        【讨论】:

        • 为什么要添加新列?如果您使用 mutate(A = ...) 而不是 A_new,您将替换第一列中的值,这正是 OP 想要的。
        • 我通常倾向于在编程时考虑到不变性。
        猜你喜欢
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-15
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多