【问题标题】:How would I capture a specific amount of numerical characters within a function in R?如何在 R 的函数中捕获特定数量的数字字符?
【发布时间】:2020-04-01 15:29:17
【问题描述】:

我确信我的问题的措辞可能会更好,但这是我正在处理的场景。

我目前的数据是这样的:

     v1    v2    v3    v4
1   abc   def    1     1
2   abc   def    1     1
3   1990  def    0     1   
v1v2 为 'abc' 或 'def' 时,

v3v4 返回 1。我的数据集中有很多实例,其中列出了典型的 4 位数上下文中的年份(例如:1960、1990、2000)。无论日期如何,如何在我的代码中包含这些以返回 v3 和 v4 的“1”?

这是我当前的代码:

df$v3 <- as.integer(grepl"(^abc$|^def$)", df$v1))
df$v4 <- as.integer(grepl"(^abc$|^def$)", df$v2))

【问题讨论】:

    标签: r match grepl


    【解决方案1】:

    只是为了确保我正确解释了您想要的输出,如果 v1 是“abc”或“def”或 4 位数年份,您希望 v3 为 1,如果 v2 为 ',您希望 v4 为 1 abc' 或 'def' 或 4 位数年份,对吗?

    如果是这样,那么您的正则表达式不仅可以查找确切的字符串 'abc' 或 'def',还可以让它查找 4 位数字。

    df$v3 <- as.integer(grepl("(^abc$|^def$|^[[:digit:]]{4}$)", df$v1))
    df$v4 <- as.integer(grepl("(^abc$|^def$|^[[:digit:]]{4}$)", df$v2))
    

    【讨论】:

    • 那是正确的,我现在将运行代码并回复您。
    • 更紧凑的正则表达式是^(?:abc|def|\\d{4})$
    • @llottmanhill 工作完美,谢谢!超出了原始问题的范围,但是您知道如果 v1/v2 恰好包含空值,我如何在 v3/v4 中报告 1?
    • @MaxH。是的,在您的 as.integer 函数中,您可以检查正则表达式匹配或缺失值。例如,as.integer(grepl("(^abc$|^def$|^[[:digit:]]{4}$)", df$v1)|is.na(df$v1))
    • @Max H。它与以更紧凑的方式编写的正则表达式完全相同。 (?:) 是一个非捕获组。它之前或/之后的内容将适用于该组中的所有组件。 \\d[[:digit:]] 的简写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2022-12-02
    • 2020-10-09
    • 2021-12-24
    • 2019-11-11
    • 2014-04-15
    • 2017-12-03
    相关资源
    最近更新 更多