【问题标题】:R - if_else assign na valueR - if_else 分配 na 值
【发布时间】:2018-12-05 16:27:16
【问题描述】:

我在 R 中有一个数据框。我的目标是使用 if_else 语句创建一个新列。如果一行中的值等于字符串"company",那么这个新列的值将是数据列中的值。否则,我想分配给 if NA 值。

我不知道如何实现,我下面的代码不起作用。因为不同的数据类型。

library(dplyr)
  active_labels <- data %>%
      mutate(start_date = if_else(type == "company", date, NA) 


Error in mutate_impl(.data, dots) : 
  Evaluation error: `false` must be type double, not logica

【问题讨论】:

标签: r if-statement


【解决方案1】:

来自if_else的帮助页面:

与基础的‘ife​​lse()’相比,这个函数更加严格。它 检查“true”和“false”是否为同一类型。

这意味着dateNA 必须属于同一类型。碰巧,NA 也有一个类型,它是logical

typeof(NA)
# [1] "logical"

因此,您需要输入版本的NA。根据date 的类型,您应该使用以下任一类型:

  • NA_real_ : typeof(NA_real_) # [1] "double"
  • NA_integer_ : typeof(NA_integer_) # [1] "integer"
  • NA_character_: typeof(NA_character_) # [1] "character"
  • NA_complex_ : typeof(NA_complex_) # [1] "complex"

如果date 不是上述情况,您应该退回到ifelse


编辑:根据您收到的错误消息,您很可能应该使用NA_real_

【讨论】:

  • 感谢@thothal。我在几个论点中一直在与 NA 作斗争……不知道你可以给它分配一个类型。
【解决方案2】:

这里也可以使用dplyr::case_when

library(dplyr)
  active_labels <- data %>%
      mutate(start_date = case_when(type == "company" ~ date, 
                                    TRUE ~ NA) 

【讨论】:

    【解决方案3】:

    试试这个:

    active_labels <- data
    active_labels$start_date <- ifelse (active_labels$type == "company", active_labels$date, NA)
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2017-06-23
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 2021-09-28
      • 2021-04-16
      相关资源
      最近更新 更多