【问题标题】:dplyr `case_when()` trouble with NAdplyr `case_when()` 遇到 NA 问题
【发布时间】:2020-02-24 03:22:50
【问题描述】:
library(tidyverse)
df <- tibble(ID = c("ABC", "EFG", "HIJ", "KLM", "NOP", "QRS"),
             Date = as.Date(c("2019-01-03", "2019-01-08", 
                              "2019-06-09", "2019-06-11",
                              "2019-08-12", "2019-08-21")))
#> # A tibble: 6 x 2
#>   ID    Date
#>   <chr> <date>        
#> 1 ABC   2019-01-03    
#> 2 EFG   2019-01-08    
#> 3 HIJ   2019-06-09    
#> 4 KLM   2019-06-11    
#> 5 NOP   2019-08-12    
#> 6 QRS   2019-08-21 

让我们从上面的数据框开始。我想要的直接在下面显示。数据框中的前两个行项满足我的case_when() 语句中的条件,并且填充了“fizz”和“buzz”。其余部分填充NA

df %>% 
  mutate(col3 = case_when(ID == "ABC" & Date == as.Date("2019-01-03") ~ "fizz",
                          ID == "EFG" & Date == as.Date("2019-01-08") ~ "buzz"))
#> # A tibble: 6 x 3
#>   ID    Date       col3 
#>   <chr> <date>     <chr>
#> 1 ABC   2019-01-03 fizz 
#> 2 EFG   2019-01-08 buzz 
#> 3 HIJ   2019-06-09 NA   
#> 4 KLM   2019-06-11 NA   
#> 5 NOP   2019-08-12 NA   
#> 6 QRS   2019-08-21 NA 

然而,当我尝试明确告诉case_when() 函数用NA 填充数据框的其余部分时,我得到如下所示的错误?我是否没有以正确的方式使用TRUE ~ NA

TRUE ~ _XYZ_ 参数不是告诉函数用_XYZ_ 填充上述条件不满足的任何条件吗?

df %>% 
  mutate(col3 = case_when(ID == "ABC" & Date == as.Date("2019-01-03") ~ "fizz",
                          ID == "EFG" & Date == as.Date("2019-01-08") ~ "buzz",
                          TRUE ~ NA)
#> Error: unexpected ',' in " 
#> ID == "EFG" & Date == as.Date("2019-01-08") ~ "buzz","

【问题讨论】:

  • 请研究?case_when:“所有RHS值必须是同一类型。不一致的类型将引发错误。这也适用于RHS中使用的NA值:NA是合乎逻辑的,请酌情使用 NA_real_NA_complexNA_character_NA_integer_ 等类型的值。"

标签: r if-statement dplyr


【解决方案1】:

case_when() 中,NA 需要属于正确的类。

class("fizz")
[1] "character"

来自文档:

All RHS values need to be of the same type. Inconsistent types will throw an error.
This applies also to NA values used in RHS: NA is logical, use
typed values like NA_real_, NA_complex, NA_character_, NA_integer_ as appropriate.

https://www.rdocumentation.org/packages/dplyr/versions/0.7.8/topics/case_when

在这里您可以使用NA_character_,这是as.character(NA) 的有用快捷方式:

df %>% 
  mutate(col3 = case_when(ID == "ABC" & Date == as.Date("2019-01-03") ~ "fizz",
                          ID == "EFG" & Date == as.Date("2019-01-08") ~ "buzz",
                          TRUE ~ NA_character_))

如文档所述,其他类型的数据存在 NA_real_NA_complexNA_integer_ 其他 NA_types。

【讨论】:

    【解决方案2】:

    试试下面的代码 - 它告诉case_when 你期望NA 是一个字符,就像你的专栏的其余部分一样。我认为您还缺少上面的括号。

    df %>% 
      mutate(col3 = case_when(ID == "ABC" & Date == as.Date("2019-01-03") ~ "fizz",
                              ID == "EFG" & Date == as.Date("2019-01-08") ~ "buzz",
                              TRUE ~ as.character(NA)))
    
    # A tibble: 6 x 3
      ID    Date       col3 
      <chr> <date>     <chr>
    1 ABC   2019-01-03 fizz 
    2 EFG   2019-01-08 buzz 
    3 HIJ   2019-06-09 NA   
    4 KLM   2019-06-11 NA   
    5 NOP   2019-08-12 NA   
    6 QRS   2019-08-21 NA 
    

    【讨论】:

    • 或使用NA_character_
    • 感谢@nova,当 RHS 是日期并且我使用 ~ as.Date(NA) 时效果很好
    猜你喜欢
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 2019-12-22
    • 2016-03-24
    • 2017-08-25
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多