如果使用严格的不等式,为什么ifelse返回1的向量?

时间:2019-03-11 17:40:40

标签: r

我意识到由于使用 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是1的向量,我的理解是<-被看作是一个赋值,而不是一个比较,但是如果是这种情况,我不明白为什么对代码进行静默评估而不是吐出一个错误。 / p>

感谢您的帮助,

J

2 个答案:

答案 0 :(得分:2)

问题是您正在使用赋值运算符<-而不是比较变量< -。您只需要再增加一个空间。比较两个版本:

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 :(得分:1)

ifelse()不应在此处引发错误:a <-3被求值,返回3,并且从0开始的每个数字`!=ˋ都将转换为ˋTRUEˋ。

ifelse在内部执行if() ... else ...,并且ˋif(3)...`认为3为TRUE。

实际上,如果您尝试过ˋifelse((a <-“ plop”),1,0)`,则会收到错误消息,因为“ plop”无法转换为逻辑。