dplyr`case_when()`不适用

时间:2019-10-28 20:38:20

标签: r if-statement dplyr

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()语句中的条件,并填充有“嘶嘶声”和“嗡嗡声”。其余的填充为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","

2 个答案:

答案 0 :(得分:3)

请尝试以下代码-它告诉df = df.reset_index(level=1, drop=True) df['word_id'] = df.groupby(level='sentence_id').cumcount() df.set_index('word_id', append=True) pos word sentence_id word_id 1 0 NNP Red 1 NN List 2 IN of 3 NNP Threatened 4 NNP Species ,您期望case_when是一个字符,就像您的专栏其余部分一样。我认为您也缺少上面的括号。

NA

答案 1 :(得分:2)

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_types 存在 NA_real_NA_complexNA_integer_ 用于其他类别的数据。