首页 > 解决方案 > 如果使用严格的不等式,为什么 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 是一个向量,我的理解是 <- 被视为赋值而不是比较,但如果是这种情况,我不明白为什么代码被悄悄地评估而不是吐出错误。

谢谢你的帮助,

Ĵ

标签: r

解决方案


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

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()TRUEas.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

推荐阅读