【问题标题】:How to extract a string from a column that contains short comments? [closed]如何从包含简短注释的列中提取字符串? [关闭]
【发布时间】:2021-04-11 04:24:28
【问题描述】:

我正在尝试编写一个代码,该代码允许我通过执行以下操作对包含来自调查的短 cmets 的数据集中的列进行重新分类:

  1. 如果评论为空/NA/空白,则分配“NO_COMMENT”
  2. 如果短评论有“过时”一词(小写、大写或任意组合),则指定“过时”
  3. 任何其他评论将保持原样

例如: 如果我有桌子

NAME COMMENT
Jean "This website seems a bit outdated for me"
Dela "I didnt like it"
Nate NA
Josh "Very outdated"

那么我会期待这样的事情:

NAME CATEGORY
Jean OUTDATED
Dela "I didnt like it"
Nate NO_COMMENT
Josh OUTDATED

是否有图书馆和文档可以做到这一点?

【问题讨论】:

    标签: r regex string


    【解决方案1】:

    您可以在嵌套的ifelse() 内使用grepl()tolower() 函数,

    df$COMMENT <- ifelse(grepl('outdated',tolower(df$COMMENT)),'OUTDATED',
                    ifelse(is.na(df$COMMENT),'NO_COMMENT',df$COMMENT))
    

    编辑:

    感谢@RuiBarradas 的评论,

    您也可以通过在其中添加 TRUE 参数来使用 grepl() 而不使用 tolower()

    df$COMMENT <- ifelse(grepl('outdated',df$COMMENT,TRUE),'OUTDATED',
                    ifelse(is.na(df$COMMENT),'NO_COMMENT',df$COMMENT))
    

    给予,

      NAME         COMMENT
    1 Jean        OUTDATED
    2 Dela I didnt like it
    3 Nate      NO_COMMENT
    4 Josh        OUTDATED
    

    数据:

    df <- data.frame(NAME=c("Jean","Dela","Nate","Josh"),
        COMMENT=c("This website seems a bit outdated for me",
            "I didnt like it",
            NA,
            "Very outdated"),stringsAsFactors=F)
    

    【讨论】:

    • 支持但grepgrepl 有一个ignore.case 参数(默认为FALSE),不需要额外的函数调用tolower
    • @RuiBarradas 嗯.. 我不知道那个论点。谢谢!
    【解决方案2】:

    tidyverse 管道语法

    • dplyr::case_when 有助于传递多个条件来改变列
    • 如果在传递的字符串中找到给定的模式,stringr::str_detect 给出 TRUE 或 FALSE。
    • tolower 消除了在任何情况下(大写、小写或混合)在列中包含 outdated 字词的可能性
    library(stringr)
    library(dplyr)
    
    df %>% mutate(COMMENT = case_when(str_detect(tolower(COMMENT), "outdated") ~ "OUTDATED",
                                      is.na(COMMENT) | COMMENT == "" ~ "NO_COMMENTS",
                                      TRUE ~ COMMENT))
    
      NAME         COMMENT
    1 Jean        OUTDATED
    2 Dela I didnt like it
    3 Nate     NO_COMMENTS
    4 Josh        OUTDATED
    
    

    使用的数据

    df <- structure(list(NAME = c("Jean", "Dela", "Nate", "Josh"), COMMENT = c("This website seems a bit OUTDATED for me", 
    "I didnt like it", NA, "Very Outdated")), class = "data.frame", row.names = c(NA, 
    -4L))
    
      NAME                                  COMMENT
    1 Jean This website seems a bit OUTDATED for me
    2 Dela                          I didnt like it
    3 Nate                                     <NA>
    4 Josh                            Very Outdated
    

    【讨论】:

      【解决方案3】:

      您可以这样做,其中(?i)确保匹配区分大小写-i不区分大小写:

      df$COMMENT <- ifelse(grepl("(?i)outdated",df$COMMENT), "OUTDATED",
                           ifelse(is.na(df$COMMENT), "NO COMMENT", df$COMMENT))
      

      结果:

      df
        NAME         COMMENT
      1 Jean        OUTDATED
      2 Dela I didnt like it
      3 Nate      NO COMMENT
      4 Josh        OUTDATED
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-28
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-19
        • 1970-01-01
        相关资源
        最近更新 更多