Filtern mittels regex Syntax

Wie erweitere ich R um eigene Funktionen oder Pakete? Welches Paket ist passend für meine Fragestellung?

Moderatoren: EDi, jogo

wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Filtern mittels regex Syntax

Beitrag von wbart »

Hallo,

ich möchte eine Tabelle mittels reguläre Ausdrücke filtern z.B. sowas wie \bMMP[1-9]\b. Wie mache ich das in R. Habe bereits grep() probiert, aber die scheint den Syntax nicht interpretieren zu können.

VG
Werner
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Filtern mittels regex Syntax

Beitrag von jogo »

Hallo Werner,

bitte immer ein kleines Beispiel angeben!

Code: Alles auswählen

x <- c("MMP4 ", " MMP5 huhu", " mMp7 no", "MMP0")

grepl("\\bMMP[1-9]\\b", x)
Gruß, Jörg
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Re: Filtern mittels regex Syntax

Beitrag von wbart »

Tabellen zu kreieren ist für mich nicht einfach. Im Original habe ich folgende Struktur:

Code: Alles auswählen

> str(Agilent_data)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	42545 obs. of  19 variables:
 $ Sequence ID                    : num  643296 643301 643302 643348 643349 ...
 $ Sequence Code                  : chr  "DarkCorner" "ETG08_142674" "ETG07_105829" "DCP_20_9" ...
 $ Primary Sequence Name          : chr  NA NA NA NA ...
 $ Sequence Description           : chr  NA NA NA NA ...
 $ MW_Placebo                     : num  1.13 1.18 1.17 1.35 1.14 ...
 $ SD_Placebo                     : num  0.1016 0.11 0.1073 0.2137 0.0903 ...
 $ CV_Placebo                     : num  8.97 9.35 9.16 15.78 7.94 ...
 $ MW_Mal                    : num  1.13 1.13 1.08 1.69 1.11 ...
 $ SD_Mal                    : num  0.0413 0.0388 0.0451 0.8444 0.0623 ...
 $ CV_Mal                    : num  3.67 3.44 4.17 49.96 5.61 ...
 $ MW_Qua                 : num  1.12 1.1 1.13 1.32 1.11 ...
 $ SD_Qua                 : num  0.1015 0.0438 0.1083 0.2896 0.0732 ...
 $ CV_Qua                 : num  9.04 3.97 9.55 21.95 6.62 ...
 $ relGex_Ma_Pl        : num  0.994 0.961 0.923 1.248 0.976 ...
 $ relGex_Qua_Pl    : num  0.991 0.938 0.968 0.974 0.971 ...
 $ relGex_Ma_Qu    : num  1.003 1.024 0.953 1.281 1.005 ...
 $ FoldChange_Ma_Pl    : num  -1.01 -1.04 -1.08 1.25 -1.02 ...
 $ FoldChange_Qua_Pl : num  -1.01 -1.07 -1.03 -1.03 -1.03 ...
 $ FoldChange_Ma_Qua: num  1 1.02 -1.05 1.28 1.01 ...
> 
Ich möchte die Spalte Primary Sequence Name nach einer Zeichenabfolge filtern welche MMP plus ein bis zwei Zahlen direkt hintendran enthält. Zeichenfolgen die vor oder hinter dieser Kombination etwas anderes haben sollen ausgeschlossen werden. Ich bekomme auch mit der o.g. Version entweder keine Treffer oder eine Fehlermeldung "Column Index must be at most x if positive. Ich glaube das liegt evtl. an der Datenstruktur. Da ich den ganzen Tag schon rumprobiere verzichte ich darauf die verschiedenen stümperhaften Programieransätze meinerseits zu posten. Wie würdet ihr es richtig machen ?

Gruß
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Filtern mittels regex Syntax

Beitrag von jogo »

Hallo Werner,

das Erste, was mir auffällt, sind die Leerzeichen in den Spaltennamen. - Sowas kann einen gefährlich aufs Kreuz legen ...
Bitter liefere mal das Ergebnis von

Code: Alles auswählen

summary(Agilent_data[[3]])
Vielleicht reicht ja auch aus, auf die NAs zu verzichten.

Und möchtest Du nur die Spalte filtern oder den ganzen Dataframe (so dass nur noch entsprechende Zeilen enthalten sind)?
Wenn Du nur die Spalte nach entspechenden Werte durchsuchen möchtest:

Code: Alles auswählen

grep("\\bMMP[1-9]\\b", Agilent_data[[3]], value=TRUE)
wenn Du alle entsprechenden Zeilen aus dem Dataframe haben möchtest:

Code: Alles auswählen

Agilent_data[grepl("\\bMMP[1-9]\\b", Agilent_data[[3]]),]
Zugriff per Name: Agilent_data[["Primary Sequence Name"]]

Gruß, Jörg
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Re: Filtern mittels regex Syntax

Beitrag von wbart »

Super, vielen Dank.

Deine Variante mit grepl liefert genau das gewünschte Ergebnis. Aber warum? Ich hatte mich für Grep entschieden weil grepl nur True und False zurückliefert.

Gruß
Werner
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Re: Filtern mittels regex Syntax

Beitrag von wbart »

Jetzt habe ich gerade festgestellt, dass mit diesem Code

Code: Alles auswählen

Agilent_data[grepl("\\bMMP[1-9]\\b", Agilent_data[[3]]),]


sich nur ein Term abfragen lässt. Ich hatte aber vor mir ein ganzes Set zusammenzustellen und dieses dann auf einmal abzufragen. der Versuch zwei Abfragen in einer Variablen zusammenzufassen scheiterte.

Code: Alles auswählen

pattern <- c("\\bMMP[1-9]\\b", "\\bCOL\\d")
Agilent_data[grepl(pattern, Agilent_data[[3]]),]
Gibt es dafür eine Lösung?
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Filtern mittels regex Syntax

Beitrag von jogo »

Hallo Werner,
wbart hat geschrieben: Di Apr 16, 2019 4:42 pm Deine Variante mit grepl liefert genau das gewünschte Ergebnis. Aber warum?
es ist nich anders als die Auswahl von Zeilen mit einem logical Indexvektor.
Die Funktion subset() macht es auch so.
Ich hatte mich für Grep entschieden weil grepl nur TRUE und FALSE zurückliefert.
... von wegen "nur" ;)

Gruß, Jörg
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Filtern mittels regex Syntax

Beitrag von jogo »

Es gibt dafür mehrere Lösungen:
1. Du kannst den ODER-Operator bei den regulären Ausdrücken verwenden.
2. oder Du verwendest zweimal grepl() und verwendest den R-Operator für ODER.
Wenn es noch mehr als zwei patterns werden sollen, würde ich mir eine kleine Funktion schreiben.
3. ich hätte noch eine hübsche dritte Variante auf Lager, aber die möchte ich zuerst mit entsprechenden Daten testen.

Gruß, Jörg
p.s.:
Und Du kannst wirklich nicht ein paar Daten liefern, z.B. das Ergebnis von

Code: Alles auswählen

dput(unique(Agilent_data[[3]])[1:20])
:?: :?
wbart hat geschrieben: Di Apr 16, 2019 5:09 pm Jetzt habe ich gerade festgestellt, dass mit diesem Code

Code: Alles auswählen

Agilent_data[grepl("\\bMMP[1-9]\\b", 3]]),]


sich nur ein Term abfragen lässt. Ich hatte aber vor mir ein ganzes Set zusammenzustellen und dieses dann auf einmal abzufragen. der Versuch zwei Abfragen in einer Variablen zusammenzufassen scheiterte.

Code: Alles auswählen

pattern <- c("\\bMMP[1-9]\\b", "\\bCOL\\d")
Agilent_data[grepl(pattern, 3]]),]
Gibt es dafür eine Lösung?
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Re: Filtern mittels regex Syntax

Beitrag von wbart »

Hallo,

geplant ist tatsächlich eine komplexe Filterung mit vielleicht 60-100 Regex Ausdrücken. Hier mal die ersten 200 Werte aus der Spalte 3:

Code: Alles auswählen

 dput(unique(Agilent_data[[3]])[1:200])
c(NA, "TIMP1", "SSR2", "TRIM28", "AEBP1", "PPP1CC", "CHI3L1", 
"BCL2A1", "SOD2", "GPI", "ALDH2", "DCTN2", "HSPD1", "PSMD7", 
"MAF", "ARMCX6", "KPNA4", "EREG", "RPLP0", "FNTA", "ATF4", "GSR", 
"CTSL1", "ATP6V0A1", "MMP12", "ID3", "SERPINA1", "CYFIP1", "NONO", 
"VCAM1", "CX3CL1", "NOS1", "ADH7", "RHOA", "SERPINB2", "MDM2", 
"FYN", "IL6", "GTF2A2", "RPL4", "SDCBP", "HNRNPF", "SLC1A4", 
"IL8", "GPNMB", "HSP90AA1", "CLTA", "TSPYL2", "MPRIP", "LTA4H", 
"RPL11", "MAZ", "MAP2K4", "MSN", "DUSP2", "RGS2", "ALDH3A1", 
"SLC25A3", "FUCA1", "ATP1B3", "CCND2", "AHRR", "TGFB2", "HDAC1", 
"ANGPT2", "MAFF", "ATP5A1", "POLR2F", "GCLC", "CCL11", "APLP2", 
"HNRNPA2B1", "RRAGA", "CCL26", "PRDX6", "DNAJB4", "PPT1", "PER2", 
"NDUFA12", "PPP1R15A", "B2M", "RAC1", "GLO1", "EIF4A2", "HSPA1A", 
"MCL1", "FBXO30", "HNRNPC", "PRDX1", "NFKBIA", "CAPN2", "ICAM1", 
"NDRG1", "TXNIP", "MMP1", "PGM1", "KDELR2", "MT1B", "BCLAF1", 
"CCL2", "TLR2", "CSF2", "ATP5J", "INHBA", "CDK7", "PER1", "COPS6", 
"S100A9", "MGP", "ENPP2", "SQLE", "PSMB4", "HSPA6", "FOSB", "GADD45A", 
"DDIT3", "PGD", "CD81", "DKK1", "CA12", "ATP6AP1", "FOS", "RPL37A", 
"KANK1", "MAFG", "ADAM10", "RPA2", "PTGR1", "ATP5F1", "EIF3E", 
"EFR3A", "HMGN3", "TMED10", "DUSP6", "CXCL10", "NARS", "GAS1", 
"CDKN1C", "CYR61", "37500", "DUSP1", "EIF1", "STXBP1", "GADD45B", 
"ANXA10", "DBP", "PTGS2", "FOSL1", "MORF4L2", "PDIA6", "MYL12A", 
"SRSF5", "CXCL1", "TTC3", "TOMM20", "PPIA", "ARHGAP1", "TTC1", 
"GPX2", "STAT1", "CCNI", "NDUFA4", "SPRY2", "ADD3", "TMSB10", 
"LAMP1", "STXBP3", "ARF3", "RPL3", "PPAP2B", "PSMB7", "CANX", 
"GSTA4", "POLR2L", "CLOCK", "RFTN1", "P4HB", "ATP5O", "CBFB", 
"COX7C", "GADD45G", "AES", "CTNNB1", "GUSB", "FAM120A", "EIF2B2", 
"PLA2G4A", "RNF10", "SRSF11", "A2M", "HPRT1", "HERPUD1", "CD164", 
"JUNB", "PGK1", "UQCRC2", "EEF2", "CCT5", "PMM1", "IL1RL1")
> 

Gruß
Werner
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Filtern mittels regex Syntax

Beitrag von jogo »

Hallo Werner,

hier ist die dritte Variante:

Code: Alles auswählen

x <- c(NA, "TIMP1", "SSR2", "TRIM28", "AEBP1", "PPP1CC", "CHI3L1", 
  "BCL2A1", "SOD2", "GPI", "ALDH2", "DCTN2", "HSPD1", "PSMD7", 
  "MAF", "ARMCX6", "KPNA4", "EREG", "RPLP0", "FNTA", "ATF4", "GSR", 
  "CTSL1", "ATP6V0A1", "MMP12", "ID3", "SERPINA1", "CYFIP1", "NONO", 
  "VCAM1", "CX3CL1", "NOS1", "ADH7", "RHOA", "SERPINB2", "MDM2", 
  "FYN", "IL6", "GTF2A2", "RPL4", "SDCBP", "HNRNPF", "SLC1A4", 
  "IL8", "GPNMB", "HSP90AA1", "CLTA", "TSPYL2", "MPRIP", "LTA4H", 
  "RPL11", "MAZ", "MAP2K4", "MSN", "DUSP2", "RGS2", "ALDH3A1", 
  "SLC25A3", "FUCA1", "ATP1B3", "CCND2", "AHRR", "TGFB2", "HDAC1", 
  "ANGPT2", "MAFF", "ATP5A1", "POLR2F", "GCLC", "CCL11", "APLP2", 
  "HNRNPA2B1", "RRAGA", "CCL26", "PRDX6", "DNAJB4", "PPT1", "PER2", 
  "NDUFA12", "PPP1R15A", "B2M", "RAC1", "GLO1", "EIF4A2", "HSPA1A", 
  "MCL1", "FBXO30", "HNRNPC", "PRDX1", "NFKBIA", "CAPN2", "ICAM1", 
  "NDRG1", "TXNIP", "MMP1", "PGM1", "KDELR2", "MT1B", "BCLAF1", 
  "CCL2", "TLR2", "CSF2", "ATP5J", "INHBA", "CDK7", "PER1", "COPS6", 
  "S100A9", "MGP", "ENPP2", "SQLE", "PSMB4", "HSPA6", "FOSB", "GADD45A", 
  "DDIT3", "PGD", "CD81", "DKK1", "CA12", "ATP6AP1", "FOS", "RPL37A", 
  "KANK1", "MAFG", "ADAM10", "RPA2", "PTGR1", "ATP5F1", "EIF3E", 
  "EFR3A", "HMGN3", "TMED10", "DUSP6", "CXCL10", "NARS", "GAS1", 
  "CDKN1C", "CYR61", "37500", "DUSP1", "EIF1", "STXBP1", "GADD45B", 
  "ANXA10", "DBP", "PTGS2", "FOSL1", "MORF4L2", "PDIA6", "MYL12A", 
  "SRSF5", "CXCL1", "TTC3", "TOMM20", "PPIA", "ARHGAP1", "TTC1", 
  "GPX2", "STAT1", "CCNI", "NDUFA4", "SPRY2", "ADD3", "TMSB10", 
  "LAMP1", "STXBP3", "ARF3", "RPL3", "PPAP2B", "PSMB7", "CANX", 
  "GSTA4", "POLR2L", "CLOCK", "RFTN1", "P4HB", "ATP5O", "CBFB", 
  "COX7C", "GADD45G", "AES", "CTNNB1", "GUSB", "FAM120A", "EIF2B2", 
  "PLA2G4A", "RNF10", "SRSF11", "A2M", "HPRT1", "HERPUD1", "CD164", 
  "JUNB", "PGK1", "UQCRC2", "EEF2", "CCT5", "PMM1", "IL1RL1")
x[grepl("\\bMMP[1-9]\\b", x)]

patterns <- c("\\bMMP[1-9]\\b", "\\bDKK\\d")
i <- apply(sapply(patterns, grepl, x=x), 1, any)

x[i]
hier noch mal die eigentliche Programmierung:

Code: Alles auswählen

patterns <- c("\\bMMP[1-9]\\b", "\\bDKK\\d")
i <- apply(sapply(patterns, grepl, x=x), 1, any)
x[i]
ich musste ein pattern verändern, damit es einen Treffer gab.

Gruß, Jörg
Antworten