【问题标题】:Delete rows containing specific strings in R在 R 中删除包含特定字符串的行
【发布时间】:2014-04-10 13:51:28
【问题描述】:

我想排除包含字符串“REVERSE”的行,但我的行与单词不完全匹配,只包含它。

我的输入数据框:

   Value   Name 
    55     REVERSE223   
    22     GENJJS
    33     REVERSE456
    44     GENJKI

我的预期输出:

   Value   Name 
    22     GENJJS
    44     GENJKI

【问题讨论】:

  • 我们为什么不改变接受的答案?!

标签: r string match rows


【解决方案1】:

这应该可以解决问题:

df[- grep("REVERSE", df$Name),]

或者更安全的版本是:

df[!grepl("REVERSE", df$Name),]

【讨论】:

  • “更安全”是什么意思?
  • 如果我想删除包含 "(" 的行怎么办。以下似乎不起作用:df[!grepl("(", df$Name),]
  • @nemja grepl 函数使用正则表达式进行匹配,其语法中( 是有意义的。如果您设置命名参数fixed = TRUE,那么grepl 将在不使用正则表达式的情况下执行文字匹配,这应该适用于您的用例。
  • @JasonMeloHall 减号 (-) 运算符确实使用负索引,而否定 (!) 运算符使用逻辑索引,因此否定运算符比减号 (-) 更安全
  • 如何修改它以删除包含匹配字符串的行上方的行?
【解决方案2】:

其实我会用:

df[ grep("REVERSE", df$Name, invert = TRUE) , ]

如果所需的搜索词不包含在任何行中,这将避免删除所有记录。

【讨论】:

    【解决方案3】:

    您可以使用 dplyr::filter() 并否定 grepl() 匹配:

    library(dplyr)
    
    df %>% 
      filter(!grepl('REVERSE', Name))
    

    或者使用 dplyr::filter() 并否定 stringr::str_detect() 匹配:

    library(stringr)
    
    df %>% 
      filter(!str_detect(Name, 'REVERSE'))
    

    【讨论】:

    • 这个问题需要很多字符串。那么如果你想删除多个字符串会发生什么,即remove.list <- c("REVERSE", "FOO", "BAR, "JJ")
    • 当然,您可以像这样创建列表:remove.list <- paste(c("REVERSE", "FOO", "BAR", "JJ"), collapse = '|') 然后像这样过滤:df %>% filter(!grepl(remove.list, Name))df %>% filter(!str_detect(Name, remove.list))
    【解决方案4】:

    您可以使用 stringi 包中的 stri_detect_fixed 函数

    stri_detect_fixed(c("REVERSE223","GENJJS"),"REVERSE")
    [1]  TRUE FALSE
    

    【讨论】:

      【解决方案5】:

      如果是多个字符串,你可以使用这个函数 df[!grepl("REVERSE|GENJJS", df$Name),]

      【讨论】:

        【解决方案6】:

        您可以使用之前提供的代码在同一个数据帧(df)中使用它

        df[!grepl("REVERSE", df$Name),]
        

        或者您可以使用此代码为数据帧分配不同的名称

        df1<-df[!grepl("REVERSE", df$Name),]
        

        【讨论】:

          猜你喜欢
          • 2019-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-21
          相关资源
          最近更新 更多