Разница в поведении между if_else и case_when с group_by - PullRequest
2 голосов
/ 02 апреля 2020

Я не могу понять, почему эти двое не ведут себя одинаково. case_when один работает так, как я ожидаю, а if_else один выдает ошибку:

Error: `true` must be length 1 (length of `condition`), not 2 
Run `rlang::last_error()` to see where the error occurred.

Пример кода:

tb <-
  tibble(DC = c(1, 1, 2), ID = c(1, 1, 2), V = c(100, 200, 400)) %>% 
  group_by(DC, ID)

tb %>%
  mutate(V = if_else(sum(V) == 300, V / n(), 1))

tb %>% 
  mutate(V = case_when(sum(V) == 300 ~ V / n(), TRUE ~ 1))

Заранее спасибо.

1 Ответ

1 голос
/ 02 апреля 2020

Это потому, что значения true и false в if_else должны иметь ту же длину, что и condition. Здесь condition имеет длину 1 (sum(V) == 300), тогда как значение true для 1-й группы имеет длину 2 (V / n()), следовательно, ошибка.

Поскольку это скалярное сравнение, вы можете использовать if / else.

library(dplyr)

tb %>% mutate(V = if(sum(V) == 300) V / n() else 1)

#    DC    ID     V
#  <dbl> <dbl> <dbl>
#1     1     1    50
#2     1     1   100
#3     2     2     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...