Нечетное поведение dplyr с использованием group_by и ifelse - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь выполнить некоторые условные манипуляции и нахожу странную ошибку dplyr - или, по крайней мере, она не ведет себя так, как мне кажется.

Допустим, у меня есть тиббл

a <- tribble( ~x, ~y, 1, 2, 1, 3, 1, -5, 2, 1, 2, 8, 2, 9 )

Теперь для каждой группы (x) я хочу увеличить его, если какое-либо из значений будет отрицательным, так что самое низкое из ранее отрицательных значений теперь равно 0. Давайте также положимв некоторых проверках ошибок, чтобы убедиться, что any() работает правильно.

a %>% group_by(x) %>% mutate(hasneg = any(y<0), y_star = ifelse(any(y<0), y+abs(min(y, na.rm=T)), y))

Это дает

# A tibble: 6 x 4
# Groups:   x [2]
      x     y hasneg y_star
  <dbl> <dbl> <lgl>   <dbl>
1     1     2 TRUE        7
2     1     3 TRUE        7
3     1    -5 TRUE        7
4     2     1 FALSE       1
5     2     8 FALSE       1
6     2     9 FALSE       1

Теперь, hasneg TRUE для x =1, и FALSE для x = 0, подразумевая, что он работал правильно на векторе.И все же мое утверждение ifelse привело к чему-то странному - либо 2 + 5 для x = 1, либо 1 для x = 2.Я бы ожидал 7,8,0,1,8,9.

Что здесь происходит?Почему ifelse странно работает с этими векторами в сгруппированном фрейме данных?

1 Ответ

0 голосов
/ 08 июня 2018

Поскольку длина условия any(y < 0) (равное 1 для каждой группы) отличается от длины значений, переданных в ifelse, поэтому выбирается только первое значение.Вам нужно if/else здесь:

a %>%
    group_by(x) %>%
    mutate(hasneg = any(y < 0),
           y_star = if(any(y < 0)) y+abs(min(y, na.rm=T)) else y)
# A tibble: 6 x 4
# Groups:   x [2]
#      x     y hasneg y_star
#  <dbl> <dbl> <lgl>   <dbl>
#1     1     2 TRUE        7
#2     1     3 TRUE        8
#3     1    -5 TRUE        0
#4     2     1 FALSE       1
#5     2     8 FALSE       8
#6     2     9 FALSE       9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...