Почему ifelse возвращает вектор 1, если используется строгое неравенство? - PullRequest
0 голосов
/ 11 марта 2019

Я понял, что мой код дает непредвиденные результаты из-за использования ifelse со строгим сравнением неравенства:

library(tidyverse)

df <- tibble(a = seq(-10,10)) %>%
  mutate( b = ifelse( (a<-3) , 1, 0) ) %>%
  mutate( c = ifelse( (a<=-3) , 1, 0) )
df

, что дает

> df
# A tibble: 21 x 3
   a     b     c
 <int> <dbl> <dbl>
1   -10     1     1
2    -9     1     1
3    -8     1     1
4    -7     1     1
5    -6     1     1
6    -5     1     1
7    -4     1     1
8    -3     1     1
9    -2     1     0
10    -1     1     0
 ... with 11 more rows

b - это вектор единиц, я понимаю, что <- воспринимается как присвоение, а не сравнение, но если это так, я не понимаю, почему код спокойно оценивается вместо того, чтобы выдавать ошибку. </p>

Спасибо за вашу помощь,

J

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Проблема в том, что вы используете оператор присваивания <- вместо сравнения < -.Вам просто нужно добавить еще один пробел.Сравните две версии:

library(tidyverse)

tibble(a = seq(-10,10)) %>%
  mutate(b_compare = ifelse(a < -3 , 1, 0),
         b_assign = ifelse(a<-3, 1, 0)) 
#> # A tibble: 21 x 3
#>        a b_compare b_assign
#>    <int>     <dbl>    <dbl>
#>  1   -10         1        1
#>  2    -9         1        1
#>  3    -8         1        1
#>  4    -7         1        1
#>  5    -6         1        1
#>  6    -5         1        1
#>  7    -4         1        1
#>  8    -3         0        1
#>  9    -2         0        1
#> 10    -1         0        1
#> # … with 11 more rows

Когда вы используете оператор присваивания <-, вы фактически делаете эквивалент ifelse(3, 1, 0), это странное логическое утверждение, но, к сожалению, ifelse() невернуть ошибку и вместо этого считать ее TRUE (проверьте действительно as.logical(3)):

ifelse(3, 1, 0)
#> [1] 1

Если бы вы использовали вместо нее dplyr::if_else(), она вернула бы ошибку:

dplyr::if_else(3, 1, 0)
#> Error: `condition` must be a logical vector, not a double vector
1 голос
/ 11 марта 2019

ifelse() не должен выдавать ошибку здесь: a <-3 вычисляется, возвращает 3 и каждое числовое `! = ˋ из 0 преобразуется в" TRUE ".

ifelse внутренне выполняет if() ... else ..., а ˋif (3) ... `считает, что 3 - ИСТИНА.

Фактически, если бы вы попробовали ˋifelse ((a <- "plop"), 1, 0) `, вы получите ошибку, поскольку" plop "не может быть преобразован в логический. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...