2016-05-03 7 views
1

Ich möchte prüfen, ob alle Elemente einer Liste das Muster haben, das ich brauche, sonst stoppe ich das ganze Skript.R Regex Semikolon

Die Beispielliste sieht wie folgt aus:

[1] 
Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanobrevibacter; 
[2] 
Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanosphaera; 
[3] 
Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanosphaera; 
[4] 
Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium; 
[5] 
Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium; 
[6] 
Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium; 
[7] 
Bacteria;Actinobacteria;Actinobacteria;Coriobacteriales;Coriobacteriaceae;Gordonibacter; 
[8] 
Bacteria;Actinobacteria;Coriobacteriia;Coriobacteriales;Coriobacteriaceae;; 
[9] 
Bacteria;Actinobacteria;Coriobacteriia;Coriobacteriales;Coriobacteriaceae;; 

I Want alle Einträge genau sechs Semikolons haben. Ich habe versucht, ein Muster mit grepl zu tun, aber ich habe Probleme mit dem richtigen Muster. Hier ist, was ich versucht

if(!any(grepl(";{6}", taxonomy))) { Through error message if the 
taxonomy is not in the right format stop("Wrong number of taxonomic 
classes\n Taxonomic levels have to be separated by semicolons (six in 
total). IMPORTANT: if taxonomic information at any level is missing, 
the semicolons are still needed:\n 
e.g.Bacteria;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;Prevotella; 
     e.g.Bacteria;Bacteroidetes;Bacteroidia;Bacteroidales;Prevotellaceae;;") 
} else { 

Aber ich immer FALSCH bekommen.

+0

Blick auf 'str_count' von' stringr' Paket – Sotos

Antwort

1
;{6} 

Spiele ";;;;;;" und sonst nichts. Sie möchten sich für so etwas wie

(?:[^;]*;){6} 

überprüfen, die, wenn übereinstimmt (mindestens) 6 Semikolons in der Zeichenfolge vorhanden sind.

Wenn Sie behaupten müssen, dass jede Zeile, die Sie testen, hat genau 6 Semikolons, müssen Sie genauer sein:

^(?:[^;]*;){6}[^;]*$ 

wo ^ und $ sind Anfang/Ende der Zeichenfolge anchors und [^;]* a Negiert character class, die eine beliebige Anzahl von Zeichen außer Semikolons entspricht.

R-Code

> x<-c('Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanobrevibacter;', 
    'Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanosphaera;', 
    'Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanosphaera;', 
    'Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium;', 
    'Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium;', 
    'Bacteria;Actinobacteria;Actinobacteria;Bifidobacteriales;Bifidobacteriaceae;Bifidobacterium;', 
    'Bacteria;Actinobacteria;Actinobacteria;Coriobacteriales;Coriobacteriaceae;Gordonibacter;', 
    'Bacteria;Actinobacteria;Coriobacteriia;Coriobacteriales;Coriobacteriaceae;;', 
    'Bacteria;Actinobacteria;Coriobacteriia;Coriobacteriales;Coriobacteriaceae;;') 
> grepl("^(?:[^;]*;){6}[^;]*$", x) 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[9] TRUE 
+1

sieht es immer gut mit Code ..) – rock321987

+0

DANKE! Du hast meinen Tag gerettet! – sanfisch

0

stringr verwenden Sie können etwas tun, wie,

library(stringr) 
which(str_count(taxonomy, ';') == 6) 

oder

grepl(6, str_count(taxonomy, ';')) 
2

count.fields gibt die Anzahl der Felder in jeder Zeile der Datei oder Verbindung n als erstes Argument angegeben, wobei das Argument sep als Feldtrennzeichen verwendet wird. Keine Pakete werden verwendet.

f <- function(x) { 
    ok <- count.fields(textConnection(x), sep = ";") == 7 
    if (any(!ok)) stop("these row numbers do not have 7 fields: ", which(!ok)) 
    # add whatever other code you need 
} 

Testen Sie es aus:

# x has 2 components having 7 and 3 semicolon-separated fields respectively 
x <- c("Archaea;Euryarchaeota;Methanobacteria;Methanobacteriales;Methanobacteriaceae;Methanobrevibacter;", ";;") 
f(x) 
## Error in f(x) : these row numbers do not have 7 fields: 2 

Siehe ?count.fields und ?textConnection.