【问题标题】:Create a Column Based on Another Column Using grepl使用 grepl 基于另一列创建列
【发布时间】:2020-06-08 14:29:57
【问题描述】:

让我们考虑一个有两列wordstemdf。我想创建一个新列来检查stem 中的值是否包含在word 中,以及它之前或之后是否有更多字符。最终结果应如下所示:

WORD     STEM     NEW
rerun    run      prefixed
runner   run      suffixed
run      run      none
...      ...      ...

到目前为止,您可以在下面看到我的代码。但是,它不起作用,因为grepl 表达式应用于df 的所有行。无论如何,我认为它应该明确我的想法。

df$new <- ifelse(grepl(paste0('.+', df$stem, '.+'), df$word), 'both',
             ifelse(grepl(paste0(df$stem, '.+'), df$word), 'suffixed',
                ifelse(grepl(paste0('.+', df$stem), df$word), 'prefixed','none')))

【问题讨论】:

    标签: r string dataframe grepl startswith


    【解决方案1】:

    您可以使用mapply 在每行中使用grepl,例如:

    ifelse(mapply(grepl, paste0(".+", x$STEM, ".+"), x$WORD), "both",
    ifelse(mapply(grepl, paste0(x$STEM, ".+"), x$WORD), "suffixed",
    ifelse(mapply(grepl, paste0(".+", x$STEM), x$WORD), "prefixed", "none")))
    #"prefixed" "suffixed"     "none" 
    

    或者使用startsWithendsWith并使用子集形式向量:

    c("none", "both", "prefixed", "suffixed")[1 + (1 + startsWith(x$WORD, x$STEM) +
     2*endsWith(x$WORD, x$STEM)) * (nchar(x$WORD) > nchar(x$STEM) &
     mapply(grepl, x$STEM, x$WORD))]
    #[1] "suffixed" "prefixed" "none"    
    

    【讨论】:

      【解决方案2】:

      您可以像这样创建new

      df$new <- ifelse(startsWith(df$word, df$stem) & endsWith(df$word, df$stem), 'none',
                       ifelse(startsWith(df$word, df$stem), 'suffixed',
                              ifelse(endsWith(df$word, df$stem), 'prefixed',
                                     'both')))
      

      或者,如果您在dplyr 管道中,并且想要避免所有烦人的df$

      df %>%
        mutate(new = ifelse(startsWith(df$word, df$stem) & endsWith(df$word, df$stem), 'none',
                            ifelse(startsWith(df$word, df$stem), 'suffixed',
                                   ifelse(endsWith(df$word, df$stem), 'prefixed',
                                          'both'))))
      

      输出

      #       word stem     new1
      # 1    rerun  run prefixed
      # 2   runner  run suffixed
      # 3      run  run     none
      # 4    aruna  run     both
      

      【讨论】:

      • 感谢您的快速响应。我选择这个答案作为解决方案,因为它与我的方法最相似。无论如何,Ian Campbell 也解决了问题
      • @hyhno01 只是为了让你知道,我已经更新了我的答案:我取消了比较单词和词干的nchar 的部分,因为我意识到它是多余的。
      【解决方案3】:

      这是str_locate 来自stringrdplyr 的一种方法:

      library(dplyr)
      library(stringr)
      data %>%
        mutate_at(vars(WORD,STEM), as.character) %>%
        mutate(NEW = 
               case_when(str_locate(WORD,STEM)[,"start"] > 1 &
                         str_locate(WORD,STEM)[,"end"] < nchar(WORD) ~ "both",
                         str_locate(WORD,STEM)[,"start"] > 1 ~ "prefixed",
                         str_locate(WORD,STEM)[,"end"] < nchar(WORD) ~ "suffixed",
                         TRUE ~ "none"))
          WORD STEM      NEW
      1  rerun  run prefixed
      2 runner  run suffixed
      3    run  run     none
      

      我添加了一行将WORDSTEM 转换为字符,以防它们是因子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-04
        相关资源
        最近更新 更多