根据正则表达式和正则表达式值改变数据框

Mutate a data frame based on regex and regex value

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

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

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)
)

我不知道你为什么要用 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 的第一个参数。那么你认为为什么会这样呢?

> df$cad <- regmatches(df$sometext, gregexpr("\[[^]]*\]", df$sometext))
> df
  id     sometext   cad
1  1 [cad] apples [cad]
2  2     bannanas