删除 R 中包含特定字符串的行

Delete rows containing specific strings in R

提问人:user3091668 提问时间:3/7/2014 最后编辑:Tunakiuser3091668 更新时间:6/22/2022 访问量:244240

问:

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

我的输入数据框:

   Value   Name 
    55     REVERSE223   
    22     GENJJS
    33     REVERSE456
    44     GENJKI

我的预期输出:

   Value   Name 
    22     GENJJS
    44     GENJKI
r 字符串 匹配

评论


答:

125赞 Pop 3/7/2014 #1

这应该可以解决问题:

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

或者更安全的版本是:

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

评论

6赞 Jason Melo Hall 1/25/2017
“更安全”是什么意思?
0赞 nemja 8/11/2017
如果我想删除包含“(”的行怎么办。以下方法似乎不起作用:df[!grepl(“(”, df$Name),]
2赞 cuttlefish 10/12/2017
@nemja 该函数使用正则表达式进行匹配,其语法 where 是有意义的。如果设置了命名参数,则将在不使用正则表达式的情况下执行文本匹配,这应该适用于您的用例。grepl(fixed = TRUEgrepl
3赞 shantanu pathak 8/30/2018
@JasonMeloHall减号 (-) 运算符使用负索引,否定 (!) 运算符使用逻辑索引,因此否定运算符比减号(-)更安全
0赞 KNN 2/26/2019
您如何修改它以删除包含匹配字符串的行上方的行?
6赞 bartektartanus 3/13/2014 #2

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

stri_detect_fixed(c("REVERSE223","GENJJS"),"REVERSE")
[1]  TRUE FALSE
21赞 BobD59 11/8/2014 #3

实际上我会使用:

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

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

31赞 sbha 3/29/2018 #4

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

library(dplyr)

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

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

library(stringr)

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

评论

2赞 micstr 8/14/2018
这个问题要求很多字符串。那么,如果您想删除多个字符串,会发生什么,即remove.list <- c("REVERSE", "FOO", "BAR, "JJ")
1赞 sbha 8/14/2018
当然,您可以像这样创建列表: 然后像这样过滤:remove.list <- paste(c("REVERSE", "FOO", "BAR", "JJ"), collapse = '|')df %>% filter(!grepl(remove.list, Name)) df %>% filter(!str_detect(Name, remove.list))
0赞 CelloRibeiro 7/4/2022
如何删除基于两列中存在的字符串的行,例如,我尝试这种方式时遇到了以下错误。filter(!grepl('REVERSE', Name & 'BAR', Name))! operations are possible only for numeric, logical or complex types
3赞 Mohamed Rahouma 10/4/2019 #5

您可以使用前面提供的代码在同一个 datafram (df) 中使用它

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

或者,您可以使用此代码为 DataFRAM 分配不同的名称

df1<-df[!grepl("REVERSE", df$Name),]
4赞 hidden-layer 7/23/2020 #6

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

1赞 sbooth 6/22/2022 #7

基于 BobD59 和隐藏层的响应的迟到答案。

这将删除多个特定字符串,同时避免在任何行中都不包含所需的搜索词时删除所有记录。

df1 <-
   df[!grepl("REVERSE|GENJJS", df$Name), (invert = TRUE), ]