所以我有一个数据框:
BMI<-c(18,25.2,31.5,19.6,11.1,25.2)
AGE<-c(21,35,45,60,99,21)
df<-data_frame(BMI,AGE)
当我将匹配运算符与Age配合使用时,它可以正常工作(30-50岁的年龄显示为true):
df<-df%>%mutate(MediumAge=if_else(AGE%in%30:50,TRUE,FALSE))
当我将Match运算符与BMI一起使用时,它不会(在该范围内的BMI的人不会显示为TRUE,唯一的人就是18个人):
df<-df%>%mutate(Medium=if_else(BMI%in%18:29,TRUE,FALSE))
很明显,一个18 BMI可能不是“ Medium”,而是为了示例中的简单数据...
必须与小数位有关,但我在文档或解决方案中找不到任何内容
答案 0 :(得分:2)
%in%
运算符是match
的包装。它不查看值的范围,而是尝试在向量中查找值的匹配项。他们不必是数字。例如:
library(tidyverse)
letters[1:6]
#> [1] "a" "b" "c" "d" "e" "f"
"e" %in% letters[1:6]
#> [1] TRUE
在拥有18:29
的位置,您正在创建一个整数向量,然后在该向量中查找BMI值的匹配项。这就是为什么BMI = 18时得到TRUE
的原因,因为那个确切的数字在那个向量中,但是25.2在那个向量中不是 ,所以它返回FALSE
。
更容易查看是否打印出要测试的向量:
30:50
#> [1] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
35 %in% 30:50
#> [1] TRUE
18:29
#> [1] 18 19 20 21 22 23 24 25 26 27 28 29
25.2 %in% 18:29
#> [1] FALSE
因此,由于您想知道一个值是否在两个数字之间的连续范围中,因此可以使用不等式:
df %>%
mutate(Medium = (BMI >= 18 & BMI <= 29))
#> # A tibble: 6 x 3
#> BMI AGE Medium
#> <dbl> <dbl> <lgl>
#> 1 18 21 TRUE
#> 2 25.2 35 TRUE
#> 3 31.5 45 FALSE
#> 4 19.6 60 TRUE
#> 5 11.1 99 FALSE
#> 6 25.2 21 TRUE
或dplyr::between
,是上述不等式的简写形式,包括其端点。
df %>%
mutate(Medium = between(BMI, 18, 29))
#> # A tibble: 6 x 3
#> BMI AGE Medium
#> <dbl> <dbl> <lgl>
#> 1 18 21 TRUE
#> 2 25.2 35 TRUE
#> 3 31.5 45 FALSE
#> 4 19.6 60 TRUE
#> 5 11.1 99 FALSE
#> 6 25.2 21 TRUE
还值得注意的是,如果您只是想获取逻辑值,则可以跳过ifelse
,因为这两种检查方法都已经返回了逻辑值。