【问题标题】:Can I use case_when (or anything else) to write with a non-static string?我可以使用 case_when (或其他任何东西)用非静态字符串编写吗?
【发布时间】:2021-12-11 05:36:03
【问题描述】:

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

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 ~ &lt;what grepl found&gt;

我可以用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),因为TRUETRUE == TRUE 是相同的。
  • @geoff 嗯,如果你作为答案发帖,我很乐意接受!

标签: r grepl


【解决方案1】:

如果需要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 函数期望相反。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2012-08-22
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多