代码之家  ›  专栏  ›  技术社区  ›  Doug Fir

基于正则表达式和正则表达式值变异数据帧

  •  0
  • Doug Fir  · 技术社区  · 7 年前

    this 张贴并尝试使用我的问题的答案。

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

    \\[[^]]*\\] 在text_字段中,在新列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)
    )
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Spacedman    7 年前

    我不知道你为什么要费心使用变异和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
  •  2
  •   Prasanna Nandakumar    7 年前
    > df$cad <- regmatches(df$sometext, gregexpr("\\[[^]]*\\]", df$sometext))
    > df
      id     sometext   cad
    1  1 [cad] apples [cad]
    2  2     bannanas