【发布时间】:2021-12-11 05:36:03
【问题描述】:
我在 R 中有一个数据框。作为对我最初的正则表达式的测试,我现在可以很好地工作。作为参考,我安装了dplyr 和magrittr,主要是出于其他原因,并且就空格和右括号而言,我遵循了一些项目范围的约定:
frame %<>% mutate(
columnA = case_when(
grepl("WXYZ *[1-9]{1,2}", columnB) == TRUE ~'HOORAY'
)
)
问题是,我想用实际找到的grepl 替换“万岁”。现在,我当然是在搜索包含 WXYZ 后跟任意数量的空格(包括 0)和一位或两位整数的字符串。
例如,如果grepl 找到字符串“WXYZ 22”,我希望将A 列中的相应条目写为“WXYZ 22”。但是如果它稍后找到“WXYZ5”,我希望它在自己的相应条目中写入“WXYZ5”。
我想要,用伪代码TRUE ~ <what grepl found>。
我可以用case_when 做到这一点吗?如果是这样,有没有更好的方法?
【问题讨论】:
-
如果一定要维护
case_when的结构,最简单的方法大概是:grepl("WXYZ *[1-9]{1,2}", columnB) == TRUE ~ str_extract(columnB, "WXYZ *[1-9]{1,2}")。虽然这在语法上有点傻,但它确实有效。 -
@geoff 我想维护
case_when的原因很大程度上与这个特定问题无关,但如果你有更优雅的解决方案,请提供。不管怎样,谢谢你! -
真的没那么糟糕,你只是做了两次字符串匹配,效率很低。显然,您的情况可能需要它,但在这种人为的情况下,另一种选择是在变异中使用
str_extract并在之后处理失败的情况。但正如谚语所说,如果它有效,它并不愚蠢。 -
同样
grepl("WXYZ *[1-9]{1,2}", columnB) == TRUE也可以是grepl("WXYZ *[1-9]{1,2}", columnB),因为TRUE和TRUE == TRUE是相同的。 -
@geoff 嗯,如果你作为答案发帖,我很乐意接受!