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