【问题标题】:Unexpected behavior with case_when and is.nacase_when 和 is.na 的意外行为
【发布时间】:2019-05-08 16:55:20
【问题描述】:

我想将列中的所有 NA 值更改为 0,将所有其他值更改为 1。但是,我无法让 case_when 和 is.na 的组合起作用。

# Create dataframe
a <- c(rep(NA,9), 2, rep(NA, 10))
b <- c(rep(NA,9), "test", rep(NA, 10))
df <- data.frame(a,b, stringsAsFactors = F)

# Create new column (c), where all NA values in (a) are transformed to 0 and other values are transformed to 1
df <- df %>% 
  mutate(
    c = case_when(
      a == is.na(.$a) ~ 0,
      FALSE ~ 1
    )
  )

我希望列 (c) 指示所有 0 值和一个 1 值,但它全是 0。

当我在 is.na 中使用 if_else 语句时,它确实有效,例如:

df <- df %>% 
  mutate(
    c = if_else(is.na(a), 0, 1))
  )

这是怎么回事?

【问题讨论】:

  • 由于您使用的是mutate,因此您可以(并且应该)在没有.$a 的情况下指向a 列。 a == is.na(a) 部分实际上没有意义,因为is.na 返回一个逻辑值,而a 是数字

标签: r dplyr


【解决方案1】:

你应该这样做:

df %>% 
    mutate(
        c = case_when(
            is.na(a) ~ 0,
            TRUE ~ 1
        )
    )

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 2021-04-01
    • 1970-01-01
    • 2013-07-13
    • 2019-05-28
    • 2021-10-10
    • 2017-03-27
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多