【问题标题】:Ifelse with NA values in columnsIfelse 列中有 NA 值
【发布时间】:2020-03-18 10:26:17
【问题描述】:

我正在尝试对具有 NA 的列应用 ifelse 语句,并希望在存在 NA 时给出 else 条件。相反,我只是得到 NA。我的实际案例使用了多个列,这让我很难找到解决方案(例如,我无法将 NA 转换为 0,因为所有列都缺少某些案例)。

数据:

df <- data.frame(a=c(NA, 1:3, NA) , b=c(NA,4:6,NA), c=c(5,10,15,20,25))

   a  b  c 
1 NA NA  5    
2  1  4 10     
3  2  5 15     
4  3  6 20     
5 NA NA 25     

尝试:

df2 <- df %>% mutate(check=ifelse((a<=2&b>4)|c==25,1,0))

结果:

   a  b  c check
1 NA NA  5    NA
2  1  4 10     0
3  2  5 15     1
4  3  6 20     0
5 NA NA 25     1

期望的输出:

   a  b  c check
1 NA NA  5   **0**
2  1  4 10     0
3  2  5 15     1
4  3  6 20     0
5 NA NA 25     1

【问题讨论】:

  • df2$check[is.na(df2$check)] &lt;- 0
  • df2 &lt;- df %&gt;% mutate(check=ifelse((a&lt;=2&amp;b&gt;4) &amp; !is.na(a) &amp; !is.na(b)|c==25,1,0))
  • 你已经很亲近了,只需要像上面一样添加!is.na(...)

标签: r dplyr


【解决方案1】:

您可以在单独的行中处理 na:

df2 <- df %>% 
  #mutate_at(vars("a", "b", "c"), ~if_else(is.na(.x), 0.0, as.double(.x))) %>% # double?
  mutate_at(vars("a", "b", "c"), ~if_else(is.na(.x), 0L, as.integer(.x))) %>% # or integer
  mutate(check=ifelse((a<=2&b>4)|c==25,1,0))

【讨论】:

    【解决方案2】:

    让我们将之前的评论合并到脚本中:

    library(dplyr)
    df <- data.frame(a=c(NA, 1:3, NA) , b=c(NA,4:6,NA), c=c(5,10,15,20,25))
    df2 <- df %>% mutate(check=ifelse((a<=2&b>4)|c==25,1,0))
    # if dataset 2 contains NA, transform into 0
    df2$check[is.na(df2$check)] <- 0
    

    【讨论】:

      【解决方案3】:

      我的答案并不完全是你想要的,但是如果你想替换 NA 值,你可以试试这个

      df[is.na(df)] <- 0
      

      输出

        a b  c
      1 0 0  5
      2 1 4 10
      3 2 5 15
      4 3 6 20
      5 0 0 25
      

      【讨论】:

        猜你喜欢
        • 2014-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-31
        • 1970-01-01
        • 2019-06-11
        • 1970-01-01
        • 2014-12-22
        相关资源
        最近更新 更多