正则表达式和数字范围的逻辑有缺陷

问题描述 投票:0回答:1

我正在尝试在名为“data”的数据集中创建一个名为“group”的新变量。变量“group”应取值“A”或“B”,具体取决于数据集中另一个变量(字符类型)的结束方式。恰好它们在下划线后面以 7 到 24 之间的数字结尾,如下所示:

enter image description here

所以,我希望当结束数字为 7 到 15(包含在内)时,新变量“组”为“A”,当结束数字为 16 到 24(包含在内)时,新变量“组”为“B”。

我尝试了这个

mutate()
函数,使用
str_detect()
来区分感兴趣的字符变量:

data %>%
mutate(group = case_when(str_detect(string = year, pattern = "[7-9]|1[0-5]$") ~ "A",
                         str_detect(string = year, pattern = "1[6-9]|2[0-4]$") ~ "B")) 

但是,结果输出并不完全正确,如下所示。

enter image description here

case_when()
的逻辑或正则表达式本身有什么问题,它也将值“A”赋予数字 16 到 19?

提前致谢!

r regex tidyverse stringr
1个回答
0
投票

在正则表达式中

"[7-9]|1[0-5]$
等可能会错误地匹配字符串中任意位置的单位数字;它会匹配
7
8
9
,即使它们是较大数字的一部分(如
27
18
' 等),除非它们位于末尾且具有特定的后续数字。

考虑到这一点,这样的事情可能会更好:

data <- data %>%
  mutate(group = case_when(
    as.numeric(str_extract(year, "\\d+(?!.*\\d)")) %in% 7:15 ~ "A",
    as.numeric(str_extract(year, "\\d+(?!.*\\d)")) %in% 16:24 ~ "B"
))
© www.soinside.com 2019 - 2024. All rights reserved.