【问题标题】:Mutate and ifelse with NA and values from other variable in R [duplicate]使用 NA 和 R 中其他变量的值进行变异和 ifelse [重复]
【发布时间】:2020-07-20 08:49:03
【问题描述】:

我有一个看起来像这样的 df:

id <- c(1:8)
born.swis <-  c(0, 1, NA, NA, NA, 2, NA, NA)
born2005 <- c(NA, NA, 2, NA, NA, NA, NA, NA)
born2006 <- c(NA, NA, NA, 1, NA, NA, NA, NA)
born2007 <- c(NA, NA, NA, NA, NA, NA, NA, 1)
born2008 <- c(NA, NA, NA, NA, NA, NA, 2, NA)
born2009 <- c(NA, NA, NA, NA, NA, NA, NA, NA)
df <- data.frame(id, born.swis, born2005, born2006, born2007, born2008, born2009)

我正在尝试根据其他变量的值来改变 Born.swis。基本上,我希望值 Bornswis 填充其他变量之一的值 IF Born.id 是 NA 并且 IF 它不是该变量的 NA 。像这样的:

id <- c(1:8)
born.swis <-  c(0, 1, 2, 1, NA, 2, 2,1)
df.desired <- data.frame(id, born.swis)

我用 mutate 和 ifelse 尝试了几件事,像这样:

df <- df%>%
  mutate(born.swis = ifelse(is.na(born.swis), born2005, NA,
                            ifelse(is.na(born.swis), born2006, NA,
                                   ifelse(is.na(born.swis), born2007, NA,
                                          ifelse(is.na(born.swis), born2008, NA,
                                                 ifelse(is.na(born.swis), born2009, NA,)
         )))))

和类似的事情,但我无法达到我想要的结果。

有什么想法吗?

非常感谢!

【问题讨论】:

    标签: r if-statement data.table dplyr


    【解决方案1】:

    一个dplyr 选项可以是:

    df %>%
     mutate(born.swis_res = coalesce(!!!select(., starts_with("born"))))
    
      id born.swis born2005 born2006 born2007 born2008 born2009 born.swis_res
    1  1         0       NA       NA       NA       NA       NA             0
    2  2         1       NA       NA       NA       NA       NA             1
    3  3        NA        2       NA       NA       NA       NA             2
    4  4        NA       NA        1       NA       NA       NA             1
    5  5        NA       NA       NA       NA       NA       NA            NA
    6  6         2       NA       NA       NA       NA       NA             2
    7  7        NA       NA       NA       NA        2       NA             2
    8  8        NA       NA       NA        1       NA       NA             1
    

    或者dplyr 1.0.0:

    df %>%
     mutate(born.swis_res = Reduce(coalesce, across(starts_with("born"))))
    

    【讨论】:

    • 这行得通。非常感谢!
    【解决方案2】:

    在基础 R 中,您可以使用 max.col

    df[cbind(1:nrow(df), max.col(!is.na(df[-1])) + 1 )]
    #[1]  0  1  2  1 NA  2  2  1
    

    max.col 给出每行(不包括第一列)中第一个非 NA 值的列位置,我们创建一个具有行索引的矩阵并将其用于子集df

    【讨论】:

      【解决方案3】:

      基础R

      df$born.swis <- apply(df[-1], 1, function(x) ifelse(all(is.na(x)), NA, sum(x, na.rm = T)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-21
        • 1970-01-01
        • 1970-01-01
        • 2019-08-27
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多