匹配运算符的行为异常

时间:2018-08-21 14:08:19

标签: r dplyr operators match

所以我有一个数据框:

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”,而是为了示例中的简单数据...

必须与小数位有关,但我在文档或解决方案中找不到任何内容

1 个答案:

答案 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,因为这两种检查方法都已经返回了逻辑值。