2017-02-27 4 views
3

strsplit()に非常に奇妙な動作があります。 this questionと似ていますが、最初は空の要素が返されている理由がわかります。誰かが知っていますか?strsplitが不可視の要素を返します

unlist(strsplit("88F5T7F4T13F", "\\d+")) 
[1] "" "F" "T" "F" "T" "F" 

私はそれを信頼しなければならない(88 * FALSE 5 * TRUE 7 * TRUE 13 * FALSE * 4 FALSE)長い論理ベクトルを再生し、その文字列のVORを使用しているので...

回答unlist(strsplit("88F5T7F4T13F", "\\d+"))[-1]作品、それは堅牢ですか?

+0

これは正常な動作が期待されており、ドキュメントで説明されています。 –

+2

開始時に数字があるため、空の要素が表示されます。数字で分割するので、最初の分割は文字列の開始と最初の 'F'の間に起こり、文字列startの空の文字列が結果のリストに追加されます。 'unlist(strsplit(sub("^\\ d + "、" "、" 88F5T7F4T13F ")、" \\ d + "))'またはあなたの解を使うことができます。 –

+0

空要素をより体系的に削除するには、num_split = unlist(strsplit( "88F5T7F4T13F"、 "\\ d +"));を使用することもできます。 num_split = num_split [num_split!= ""] –

答えて

1

最初に桁があるため、空の要素が表示されます。数字で分割するので、最初の分割は文字列の先頭と最初のFの間に発生し、文字列startの空の文字列が結果のリストに追加されます。

既に効果的であるため、独自のソリューションを使用することができます。 ^は、文字列の先頭と\d+マッチ1以上である(それは^\d+パターンとsubので、結果として分割disapperで空の要素を作る

unlist(strsplit(sub("^\\d+", "", "88F5T7F4T13F"), "\\d+")) 

をすべての主要な数字を削除:あなたは他のソリューションに興味がある場合は、以下を参照してくださいより多くの数字)。しかし、2つの正規表現を使用するので、堅牢ではありません。 1以上の非数字シンボル、および1個の外部ライブラリ -

library(stringr) 
res = str_extract_all(s, "\\D+") 

これは一つだけ正規表現、\D+のマッチングが必要です。

あなたは、ベース・Rと同様のことを行うgregexprregmatchesを使用する場合:

regmatches(s, gregexpr("\\D+", s)) 
関連する問題