我可以使用 case_when (或其他任何东西)来编写非静态字符串吗?

Can I use case_when (or anything else) to write with a non-static string?

我在 R 中有一个数据框。作为对我最初的正则表达式的测试,我目前正在出色地工作。作为参考,我安装了 dplyrmagrittr,主要是出于其他原因,就空格和右括号而言,我遵循一些项目范围的约定:

frame %<>% mutate(
   columnA = case_when(
       grepl("WXYZ *[1-9]{1,2}", columnB) == TRUE ~'HOORAY'
   )
)

问题是,我想用实际找到的 grepl 替换 'HOORAY'。现在,我当然正在搜索包含 WXYZ 后跟任意数量的空格(包括 0)然后是一位或两位整数的字符串。

例如,如果 grepl 找到字符串“WXYZ 22”,我希望将 columnA 中的相应条目写为“WXYZ 22”。但是如果它以后找到“WXYZ5”,我希望它在自己对应的条目中写上“WXYZ5”。

我想要,在伪代码中TRUE ~ <what grepl found>

我可以用 case_when 做这个吗?如果可以,有没有更好的办法?

如果 case_when 结构是必需的,这个使用 stringr 的解决方案有效:

grepl("WXYZ *[1-9]{1,2}", columnB) ~ str_extract(columnB, "WXYZ *[1-9]{1,2}")

根据更大的问题设置,您也可以这样做:

mutate(columnA = str_extract(columnB, "WXYZ *[1-9]{1,2}"))

请注意,对于无法匹配的情况,columnA 将是 NA。另请注意,虽然 grep 首先需要模式,然后是目标字符串,但 stringr 函数需要相反的结果。