【问题标题】:Mutate a data frame based on regex and regex value根据正则表达式和正则表达式值改变数据框
【发布时间】:2017-07-14 07:01:05
【问题描述】:

一个特征是否与正则表达式匹配,我想使用匹配的值来填充一个新特征,否则不适用。

我找到了this 帖子并尝试使用答案来解决我的问题。

library(dplyr)
library(stringr)

dat.p <- dat.p %>%
  mutate(
    cad = ifelse(str_locate(text_field, "\\[[^]]*\\]"), 
                 str_extract(text_field, "\\[[^]]*\\]"),
                 NA)
    )

如果 text_field 中的正则表达式 \\[[^]]*\\] 匹配,则在新列 cad 中使用该值,否则将值设为 cad NA。

当我运行它时,我得到了错误:

Error: wrong result size (1000000), expected 500000 or 1

我该怎么做?

一些示例数据:

df <- data.frame(
  id = 1:2,
  sometext = c("[cad] apples", "bannanas")
)

df.desired <- data.frame(
  id = 1:2,
  sometext = c("[cad] apples", "bannanas"),
  cad = c("[cad]", NA)
)

【问题讨论】:

    标签: r regex dplyr stringr


    【解决方案1】:

    我不知道你为什么要使用 mutate 和 ifelse 来打扰它,因为它使用 str_extract 如果它不提取任何内容就会给你一个 NA 的事实:

    > df$cad = str_extract(df$sometext,"\\[[^]]*\\]")
    > df
      id     sometext   cad
    1  1 [cad] apples [cad]
    2  2     bannanas  <NA>
    

    您可以通过单独尝试表达式并查看会发生什么来调试 R。例如,您的 ifelse 的第一个元素是:

    > str_locate(df$sometext,"\\[[^]]*\\]")
         start end
    [1,]     1   5
    [2,]    NA  NA
    

    这显然不能作为ifelse 的第一个参数。那你为什么认为它会呢?

    【讨论】:

      【解决方案2】:
      > df$cad <- regmatches(df$sometext, gregexpr("\\[[^]]*\\]", df$sometext))
      > df
        id     sometext   cad
      1  1 [cad] apples [cad]
      2  2     bannanas 
      

      【讨论】:

      • 给了你一个 +1 的使用基础,但后来意识到你没有将缺失的匹配设置为 NA...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多