Home > Blockchain >  Remove rows containing specific strings
Remove rows containing specific strings

Time:08-10

I want to remove rows containing specific strings which I stored in a separate vector.

I tried everything from Delete rows containing specific strings in R and Remove Rows From Data Frame where a Row matches a String but it always removes every row and my output is empty I tried it with an example and it works fine, but not for my input and my remove_list

My input is:

   ID Aufzeichnungen                                                                 
   <dbl> <chr>                                                                          
 1     1 "Aufzeichnungen"                                                               
 2     1 "07.03.22   A: stechender Schmerz"                                             
 3     1 "    scharfkantig"                                                             
 4     1 "D/B:"                                                                         
 5     1 "T:"                                                                           
 6     1 "pat aht an 36 üz distal"                                                      
 7     1 " seit paartagen"                                                              
 8     1 "36 vipr  "                                                                    
 9     1 " perk-"                                                                       
10     1 " keine c zu entdekcne"                                                        
11     1 "üz bilfuird"                                                                  
12     1 "pat aufgekläörtggf  RÖ um c auszuschileßen"                                   
13     1 " pat verweigert RÖ aus Angst vor Strahlung"                                   
14     1 " pat"                                                                         
15     1 "aufgeklärt angst nicht nötig und c unter fllg oder apprx nicht auszuschließen"
16     1 ""                                                                             
17     1 "pat knirscht"                                                                 
18     1 " schiene empohlen"                                                            
19     1 " pat meldet sich.."

and I want to remove every row containing strings from this list:

remove_list <- paste(c("einverst", "empf", "raten", "aufgeklä", "nicht", "weiß nicht", "bespr", "soll",
                       "kein", "?", "raten", "klären", "überprüf", "erst, wenn", "verweiger", 
                       "notwendig"), collapse = '|')

Logically it should remove rows 10, 12, 13, 15

My codes are:

removed <-  PKV[grep(remove_list, PKV$Aufzeichnungen, invert = TRUE), ]
removed <- PKV %>% filter(!grepl(remove.list, PKV$Aufzeichnungen ))

and also every variant with str_detect

But the output looks always like this:

# A tibble: 0 × 2
# Groups:   ID [0]
# … with 2 variables: ID <dbl>, Aufzeichnungen <chr>

Thank you for your help!

CodePudding user response:

Try this:

remove_list <- c("einverst", "empf", "raten", "aufgeklä", "nicht", "weiß nicht", "bespr", "soll",
                       "kein", "?", "raten", "klären", "überprüf", "erst, wenn", "verweiger", 
                       "notwendig")

mylist <- c("notwendig","einverst","1","2" )

mylist[!mylist %in% remove_list]
#> [1] "1" "2"

Created on 2022-08-10 by the reprex package (v2.0.1)

CodePudding user response:

I see that you have a question mark in remove_list but ? has a meaning in regex. So I suggest you escape it, i.e.

remove_list <- paste(c("einverst", "empf", "raten", "aufgeklä", "nicht", "weiß nicht", "bespr", "soll",
                       "kein", "\\?", "raten", "klären", "überprüf", "erst, wenn", "verweiger", 
                       "notwendig"), collapse = '|')

Then select the right rows, using the inverse of the grepl using !

PKV[!grepl(remove_list, PKV$AUFZEICHNUNGEN),]

Example of escaping ?:

#first rows of your data
dt <- structure(list(ID = c(1, 1, 1, 1, 1, 1, 1, 1), AUFZEICHNUNGEN = c("Aufzeichnungen", 
"07.03.22   A: stechender Schmerz", "    scharfkantig", "D/B:", 
" keine c zu entdekcne", "pat aufgekläörtggf  RÖ um c auszuschileßen", 
" seit paartagen", "36 vipr  ")), class = "data.frame", row.names = c(NA, 
-8L))

#grepl without escaping ?
grepl("?", PKV$AUFZEICHNUNGEN)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

#grepl with escaping ?
grepl("\\?", PKV$AUFZEICHNUNGEN)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

CodePudding user response:

  • We can first grep the indices of the rows contains one of remove_list words , then exclude them from your data.frame
remove_ind <- lapply(strsplit(remove_list , "\\|")[[1]] ,
              \(x) grep(x , PKV$Aufzeichnungen , fixed = T)) |>
              unlist() |> unique()

#> [1] 12 15 10 13

PKV[-remove_ind,]

  • output
   ID                   Aufzeichnungen
1   1                   Aufzeichnungen
2   1 07.03.22   A: stechender Schmerz
3   1                     scharfkantig
4   1                             D/B:
5   1                               T:
6   1          pat aht an 36 üz distal
7   1                   seit paartagen
8   1                        36 vipr  
9   1                            perk-
11  1                      üz bilfuird
14  1                              pat
16  1                                 
17  1                     pat knirscht
18  1                 schiene empohlen
19  1                pat meldet sich..
  • Related