dplyr :: case_when可以返回NAs和非NA的组合吗?

时间:2017-10-20 05:21:44

标签: r dplyr

case_when()中的dplyr可以返回NA和非NA值的组合吗?

当我要求它返回NA以响应一个语句,但是响应另一个语句时返回非NA值时,它会抛出一个评估错误:

例如,我希望1代表cyl >= 6的所有值,NA代表cyl < 6

的值
> library("dplyr")
> mtcars %>% mutate(thing = case_when(cyl >= 6 ~ 1, cyl < 6 ~ NA ))
  

mutate_impl(.data,dots)中的错误:评估错误:必须是类型   双重,不合逻辑。

单独,这两个陈述都很好。

如果要求返回所有NAs,而不是NA和非NA s的混合,则不会出现此问题。

例如:对NA

的所有值返回cyl >= 6
> 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类型,不合逻辑。

不酷。

注意:为清晰起见,示例中的返回项目全部来自表达式末尾的mtcars[1:3,] %>% select(cyl, thing)

1 个答案:

答案 0 :(得分:4)

以下是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