dplyr `case_when ()` проблема с NA - PullRequest
0 голосов
/ 28 октября 2019
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","

1 Ответ

3 голосов
/ 28 октября 2019

Попробуйте следующий код - он сообщает 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...