2016-05-03 18 views
1

リストのすべての要素に必要なパターンがあるかどうかを確認したい場合は、スクリプト全体を停止します。R正規表現セミコロン

例のリストは、次のようになります。

[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;; 

は私のすべてのエントリは正確に6セミコロンを持っていると思います。 greplでパターンマッチングを試みましたが、正しいパターンで問題があります。 は、ここで私は

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 { 

を試してみました。しかし、私は常にFALSE得るものです。

+0

'stringr'パッケージの' str_count'を見てください。 – Sotos

答えて

1
;{6} 

";;;;;;"と一致します。

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

などの文字列に(少なくとも)6つのセミコロンが含まれているかどうかを確認します。あなたは、テストの各ラインは正確 6セミコロンを持っていると主張する必要がある場合は

、あなたはより具体的にする必要があります。

^(?:[^;]*;){6}[^;]*$ 
^$が文字列 anchorsの開始/終了です

[^;]*がありますcharacter classは、セミコロンを除く任意の数の文字に一致します。あなたのような何かを行うことができますstringrを使用

Rコード

> 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

これは常にコードでうまくいきます..) – rock321987

+0

感謝します!あなたは私の一日を救った! – sanfisch

0

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

または

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

count.fieldsは、ファイルの各行のフィールドの数を返します。またはコネチカフィールドの区切り文字としてsep引数を使用して、最初の引数として指定されます。パッケージは使用されません。

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 
} 

テストそれアウト:

# 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 

?count.fields?textConnectionを参照してください。