如何更高效地改写str_detect()的多条件判断代码?
高效改写方案
改写后的完整代码
mutate(method = paste0("M", cur_group_id())) %>% mutate(method = case_when( # 合并原M2的6个匹配条件 str_detect(variable, "testhc3[5-7]|testhi[1-3]") ~ "M2", method == "M1" ~ "M1", # 合并原M3的6个匹配条件 str_detect(variable, "testhc(3[8-9]|40)|testhi[4-6]") ~ "M3" )) %>% unite(method_trait, c("method", "trait"), sep = "")
优化说明
合并重复的字符串检测条件
- 原代码中针对M2的6个
str_detect,可以用正则表达式合并:testhc3[5-7]匹配testhc35/36/37,testhi[1-3]匹配testhi1/2/3,用|表示逻辑“或”,一次检测即可覆盖所有原条件。 - 针对M3的6个
str_detect,用testhc(3[8-9]|40)匹配testhc38/39/40,testhi[4-6]匹配testhi4/5/6,同样通过|合并成单个检测。
- 原代码中针对M2的6个
简化method初始化步骤
原代码中先给method赋值cur_group_id(),再追加"M"前缀,可以合并成一步paste0("M", cur_group_id()),减少一次mutate调用,代码更简洁。可选的直观写法(适合正则不熟练的场景)
如果觉得正则不够直观,也可以显式列出所有匹配项,可读性更强:str_detect(variable, "testhc35|testhc36|testhc37|testhi1|testhi2|testhi3") ~ "M2", # ... str_detect(variable, "testhc38|testhc39|testhc40|testhi4|testhi5|testhi6") ~ "M3"
内容的提问来源于stack exchange,提问作者user19562955
相关产品推荐
相关产品推荐

