I have a dataset with two variables ("Aufzeichnungen" , "ID"). I want to remove all lines of the Dataset that contains the word "next" and also remove the following lines until the next ID-Number starts.
I have different cases and every ID is a customertreatment, but the word "next" and all the following lines of the same ID have to be removed.
That's my input:
Aufzeichnungen ID
1 07.03.22 A: stechender Schmerz, scharfkantig 1
2 D/B: 1
3 T: 1
4 pat aht an 36 üz distal, seit paartagen 1
5 36 vipr , perk-, keine c zu entdekcne,üz bilfuird 1
6 pat aufgekläörtggf RÖ um c auszuschileßen, pat verweigert RÖ aus Angst vor Strahlung, pat 1
7 aufgeklärt angst nicht nötig und c unter fllg oder apprx nicht auszuschließen, 1
8 pat knirscht, schiene empohlen, pat meldet sich.. 1
9 next: noch schmerezn 1
10 an 36? 1
11 20.11.21 A: kontrolle 2
12 D/B: 2
13 T: 2
14 ->Pat. geht es besser hat keine blutung mehr, bltung stabil, pat aufgeklärt muss noch 1 tag stabil 2
15 bleiben dann sollten keine Nahcbltung mehr kommen! wenn doch dann montag gleich wieder zu 2
16 rkontrolle und in towche Nahtx 2
17 ->gute wundheilung, tupfer mitgegeben 2
18 -> 2
19 <NA> 2
20 next 0 1 Kontrolle Naht 2
21 ex bei F2 2
22 K3/BV 2
that's my input.
My output should look like:
Aufzeichnungen ID
1 07.03.22 A: stechender Schmerz, scharfkantig 1
2 D/B: 1
3 T: 1
4 pat aht an 36 üz distal, seit paartagen 1
5 36 vipr , perk-, keine c zu entdekcne,üz bilfuird 1
6 pat aufgekläörtggf RÖ um c auszuschileßen, pat verweigert RÖ aus Angst vor Strahlung, pat 1
7 aufgeklärt angst nicht nötig und c unter fllg oder apprx nicht auszuschließen, 1
8 pat knirscht, schiene empohlen, pat meldet sich.. 1
9
11 20.11.21 A: kontrolle 2
12 D/B: 2
13 T: 2
14 ->Pat. geht es besser hat keine blutung mehr, bltung stabil, pat aufgeklärt muss noch 1 tag stabil 2
15 bleiben dann sollten keine Nahcbltung mehr kommen! wenn doch dann montag gleich wieder zu 2
16 rkontrolle und in towche Nahtx 2
17 ->gute wundheilung, tupfer mitgegeben 2
18 -> 2
19 <NA> 2
20
So that lines 9,10 and 20,21,22 are removed.
I tried with new_df= PKV[!grepl("ext",PKV$Aufzeichnungen),]
but this removes just one line and is not specific for the ID
CodePudding user response:
We can use slice
function from dplyr
and grepl
the first index having the word next
or Next
and slice the above lines
library(dplyr)
PKV |> group_by(ID) |>
slice(1:(which(grepl("[Nn]ext" , Aufzeichnungen))[1]-1))
- output
# A tibble: 17 × 2
# Groups: ID [2]
Aufzeichnungen ID
<chr> <int>
1 "07.03.22 A: stechender Schmerz, scharfkantig" 1
2 "D/B:" 1
3 "T:" 1
4 "pat aht an 36 üz distal, seit paartagen" 1
5 "36 vipr , perk-, keine c zu entdekcne,üz bilfuird" 1
6 "pat aufgekläörtggf RÖ um c auszuschileßen, pat verweigert RÖ aus An… 1
7 "aufgeklärt angst nicht nötig und c unter fllg oder apprx nicht auszu… 1
8 "pat knirscht, schiene empohlen, pat meldet sich.." 1
9 "20.11.21 A: kontrolle" 2
10 " D/B:" 2
11 "T:" 2
12 "->Pat. geht es besser hat keine blutung mehr, bltung stabil, pat auf… 2
13 "bleiben dann sollten keine Nahcbltung mehr kommen! wenn doch dann mo… 2
14 "rkontrolle und in towche Nahtx" 2
15 "->gute wundheilung, tupfer mitgegeben" 2
16 "->" 2
17 "<NA>" 2
For efficiency we can use data.table
library
library(data.table)
setDT(PKV)
PKV[ , .SD[1:(which(grepl("[Nn]ext" , Aufzeichnungen))[1]-1)] , by = "ID"][]
CodePudding user response:
Update: After managing to load the original df like Mohamed Desouky 1 did. Here is a more concise solution:
We group by ID
and id
(where id
is the group when "next" or "Next" appears until the next "next" or "Next" appears.
Then filter if both are not equal:
library(dplyr)
test %>%
group_by(id = cumsum(grepl('next|Next', Aufzeichnungen))) %>%
filter(ID!=id) %>%
ungroup() %>%
select(-id)
Aufzeichnungen ID
<chr> <dbl>
1 1 07.03.22 A: stechender Schme… 1
2 2 … 1
3 3 … 1
4 4 pat aht an 36 ??z di… 1
5 5 36 vipr , perk-, keine c zu en… 1
6 6 pat aufgekl????rtggf R?? um c auszuschile??en, pat verweigert R?? aus … 1
7 7 aufgekl??rt angst nicht n??tig und c unter fllg oder apprx … 1
8 8 pat knirscht, schiene empohlen… 1
9 11 20.11.21 … 2
10 12 … 2
11 13 … 2
12 14 ->Pat. geht es besser hat keine blutung mehr, bltung stabil, pat aufgekl??rt mu… 2
13 15 bleiben dann sollten keine Nahcbltung mehr kommen! wenn doch dann mont… 2
14 16 rkontrolle … 2
15 17 ->gute wundheilung… 2
16 18 … 2
17 19 … 2
First answer: Somehow the last line is not in my dataframe. Anyway here is possible way how we could do it.
The problem is to identify the unique ID column. So for this example this will work. But if id > 9 e.g. we have to adapt the code:
library(tidyverse)
test %>%
mutate(across(, ~str_squish(.))) %>%
mutate(x = parse_number(str_sub(Aufzeichnungen,-1,-1))) %>%
fill(x, .direction = "downup") %>%
mutate(helper = cumsum(str_detect(Aufzeichnungen, 'next'))) %>%
group_by(helper, x) %>%
filter(x!=helper) %>%
ungroup() %>%
select(-x, -helper)
Aufzeichnungen ID
<chr> <chr>
1 1 07.03.22 A: stechender Schmerz scharfkantig 1
2 2 D/B: 1 NA
3 3 T: 1 NA
4 4 pat aht an 36 ??z distal seit paartagen 1
5 5 36 vipr perk-, keine c zu entdekcne,??z bil…
6 6 pat aufgekl????rtggf R?? um c auszuschile??en pat verweigert R?? aus Angst vor St…
7 7 aufgekl??rt angst nicht n??tig und c unter fllg oder apprx nicht auszuschlie??en 1
8 8 pat knirscht schiene empohlen, pat meldet sich..…
9 11 20.11.21 A: kontrolle 2 NA
10 12 D/B: 2 NA
11 13 T: 2 NA
12 14 ->Pat. geht es besser hat keine blutung mehr bltung stabil, pat aufgekl??rt muss…
13 15 bleiben dann sollten keine Nahcbltung mehr kommen! wenn doch dann montag gleich wieder zu 2 NA
14 16 rkontrolle und in towche Nahtx 2 NA
15 17 ->gute wundheilung tupfer mitgegeben 2
16 18 -> 2 NA
17 19 <NA> 2 NA