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 ofremove_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..