2017-02-27 3 views
3

Ich fand ein sehr seltsames Verhalten in strsplit(). Es ist ähnlich wie this question, aber ich würde gerne wissen, warum es ein leeres Element an erster Stelle zurückgibt. Weiß jemand das?strsplit gibt unsichtbares Element zurück

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

Da ich diese Zeichenfolge vor einem langen logischen Vektor (88 * FALSCH 5 * TRUE 7 * FALSCH 4 * TRUE 13 * FALSCH) Reproduzieren wir vertrauen müssen ...

Antwort unlist(strsplit("88F5T7F4T13F", "\\d+"))[-1] Werke aber ist es robust?

+0

Dieses Verhalten wird erwartet und ist in der Dokumentation erläutert. –

+2

Das leere Element erscheint, da am Anfang Ziffern stehen. Da Sie bei Ziffern aufteilen, tritt die erste Teilung zwischen dem Anfang der Zeichenfolge und dem ersten "F" auf, und die leere Zeichenfolge am Anfang der Zeichenfolge wird der resultierenden Liste hinzugefügt. Sie können 'unlist (strsplit (sub ("^\\ d + "," "," 88F5T7F4T13F ")," \\ d + ")) oder Ihre Lösung verwenden. –

+0

Um die leeren Elemente systematischer zu entfernen, können Sie auch num_split = unlist verwenden (strsplit ("88F5T7F4T13F", "\\ d +")); num_split = num_split [num_split! = ""] –

Antwort

1

Das leere Element erscheint, da am Anfang Ziffern vorhanden sind. Da Sie bei Ziffern aufteilen, tritt die erste Teilung zwischen dem Anfang der Zeichenfolge und dem ersten F auf, und die leere Zeichenfolge am Anfang der Zeichenfolge wird der resultierenden Liste hinzugefügt.

Sie können Ihre eigene Lösung verwenden, da sie bereits gut funktioniert. Wenn Sie in alternativen Lösungen interessiert sind, finden Sie unter:

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

Es macht das leere Element in dem resultierenden geteilten disapper seit den sub mit ^\d+ Mustern entfernt alle führenden Ziffern (^ der Beginn der Zeichenfolge und \d+ Streichhölzer 1 oder mehr Ziffern). Es ist jedoch nicht robust, da es 2 Regexps verwendet.

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

Dies erfordert nur eine passende regex, \D+ - 1 oder mehr Nicht-stellige Symbole, und eine externe Bibliothek.

Wenn Sie eine ähnliche Sache mit Base R tun wollen, verwenden regmatches mit gregexpr:

regmatches(s, gregexpr("\\D+", s)) 
Verwandte Themen