我意识到由于使用 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
答案 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”无法转换为逻辑。