问题在于语句的顺序以及%in% 的一般属性,它确实检查列中的所有值或使用c 创建的向量,因此将所有TRUE 作为这些值返回' LagVar' 存在于 'Var' 列中
library(dplyr)
sd %>%
mutate(Flag = ((LagVar %in% c(Var, Var - 1)) | (Var == 1)))
-输出
ID Var LagVar Flag
1 P2 1 NA TRUE
2 P2 2 1 TRUE
3 P2 4 2 TRUE
4 P2 6 4 TRUE
返回所有TRUE,因此它只检查那个而不是进入下一个
如果我们用一个简单的例子
v1 <- 1:5
case_when(v1 <= 5 ~ FALSE, TRUE ~ TRUE)
[1] FALSE FALSE FALSE FALSE FALSE
第一个条件返回所有TRUE,因此它不会执行下一个条件。 ~ 是根据条件而不是条件本身来分配值。如果我们要执行下一个条件,第一个应该返回 FALSE 而不是赋值
case_when(v1 > 5~ FALSE, TRUE ~ TRUE)
[[1] TRUE TRUE TRUE TRUE TRUE
实际条件和返回值之间存在混淆,因为两者都是合乎逻辑的
当我们执行%in% 时,它会检查所有行,除非分组。我们可以添加rowwise 属性来防止检查所有行
sd %>%
rowwise %>%
mutate(Flag = !(LagVar %in% c(Var, Var-1)|(Var == 1))) %>%
ungroup
# A tibble: 4 x 4
ID Var LagVar Flag
<chr> <int> <int> <lgl>
1 P2 1 NA FALSE
2 P2 2 1 FALSE
3 P2 4 2 TRUE
4 P2 6 4 TRUE
或者我们可能需要使用== 和| 再添加一个条件,因为== 进行元素比较
sd %>%
mutate(Flag = !(LagVar == Var| LagVar == (Var - 1)|(Var == 1)))
ID Var LagVar Flag
1 P2 1 NA FALSE
2 P2 2 1 FALSE
3 P2 4 2 TRUE
4 P2 6 4 TRUE