我正在尝试在名为“data”的数据集中创建一个名为“group”的新变量。变量“group”应取值“A”或“B”,具体取决于数据集中另一个变量(字符类型)的结束方式。恰好它们在下划线后面以 7 到 24 之间的数字结尾,如下所示:
所以,我希望当结束数字为 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"))
但是,结果输出并不完全正确,如下所示。
case_when()
的逻辑或正则表达式本身有什么问题,它也将值“A”赋予数字 16 到 19?
提前致谢!
在正则表达式中
"[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"
))