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



我意识到,由于使用 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是一个向量,我的理解是&lt; - 被视为分配而不是比较,但是如果是这种情况,我不明白为什么对代码进行悄悄评估而不是吐出错误。

感谢您的帮助,

J

问题是您正在使用分配运算符<-而不是比较一个< -。您只需要再添加一个空间即可。比较两个版本:

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

ifelse()不应该在此处丢弃错误:评估了a <-3,返回3,每个数字`!=ˋˋˋ=从0转换为ˋTrueˋ。

ifelse内部执行if() ... else ...和ˋIF(3)...`认为3是正确的。

实际上,如果您尝试了ˋIfelse((A&lt; - " plop"),1,0)`,您会遇到一个错误,因为" plop"无法转换为逻辑。

最新更新