dplyr::case_when能否返回包含NA和非NA值的混合结果?

6
< p >在< code >dplyr中,< code >case_when()能否返回混合的< code >NA和非< code >NA值? < p >当我要求它在响应一个语句时返回< code >NA,但在响应另一个语句时返回非< code >NA值时,它会抛出一个评估错误: < p >例如,我希望对于所有< code >cyl >= 6的值返回< code >1,并且对于< code >cyl <6的值返回< code >NA
> library("dplyr")
> mtcars %>% mutate(thing = case_when(cyl >= 6 ~ 1, cyl < 6 ~ NA ))

mutate_impl(.data, dots) 中出现错误:评估错误:必须是双精度浮点型,而不是逻辑型。

单独执行这两个语句均正常运行。

如果要求返回所有的 NA,而不是混合了 NA 和非 NA 的结果,则不存在此问题。

例如:对于所有 cyl >= 6 的值,返回 NA

> mtcars %>% mutate(thing = case_when(cyl >= 6 ~ NA))
  cyl thing
1   6    NA
2   6    NA
3   4    NA

看起来不错。

> mtcars %>% mutate(thing = case_when(cyl >= 6 ~ NA, cyl < 6 ~ NA ))
  cyl thing
1   6    NA
2   6    NA
3   4    NA

很棒。
> mtcars[1:3,] %>% mutate(thing = case_when(cyl == 6 ~ 1, cyl < 6 ~ NA, cyl > 6 ~ NA ))

在 mutate_impl(.data, dots) 中出现错误: 评估错误:必须是 double 类型,而不是 logical。(意思是表达式的计算结果应该是 double 类型,但实际得到了 logical 类型)

真不爽。

NB: 为了清晰起见,在示例中返回的项都来自于 mtcars[1:3,],并以 %>% select(cyl, thing) 结尾。

1个回答

8

关于 class 的问题在于我们需要让NA_real 与数值类型相匹配。

mtcars %>% 
      mutate(thing = case_when(cyl >= 6 ~ 1,
                               cyl < 6 ~ NA_real_ )) 

此外,对于第二种情况。
mtcars[1:3,] %>% 
       mutate(thing = case_when(cyl == 6 ~ 1, 
                                cyl < 6 ~ NA_real_, 
                                cyl > 6 ~ NA_real_ ))  %>%
       select(cyl, thing)
# cyl thing
#   6     1
#   6     1
#   4    NA

2
是的,在读了TFM十几遍之后,我现在明白了“所有RHS都必须评估为相同类型的向量。” - Scransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接