2017-02-27 83 views
3

我在strsplit()中發現了一個非常奇怪的行爲。它與this question類似,但我很想知道爲什麼它首先返回一個空元素。有人知道嗎?strsplit返回隱形元素

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

由於我使用該字符串VOR再現長的邏輯矢量(88 * FALSE 5 * TRUE 7 * FALSE 4 * TRUE 13 * FALSE)我要相信它......

回答unlist(strsplit("88F5T7F4T13F", "\\d+"))[-1]作品,但它是否健壯?

+0

這是正常現象,在文檔中進行了說明。 –

+2

因爲在開始時有數字,所以出現空的元素。由於在數字處進行分割,因此第一次分割會在字符串的開頭和第一個「F」之間進行,而字符串開頭處的空字符串會添加到結果列表中。你可以使用'unlist(strsplit(sub(「^ \\ d +」,「」,「88F5T7F4T13F」),「\\ d +」))'或你的解決方案。 –

+0

爲了以更系統的方式刪除空元素,您還可以使用num_split = unlist(strsplit(「88F5T7F4T13F」,「\\ d +」)); num_split = num_split [num_split!=「」] –

回答

1

由於在開始處有數字,所以出現空的元素。由於您在數字處進行了分割,因此第一次分割將在字符串的開頭和第一個F之間進行,並且字符串開頭處的空字符串會添加到結果列表中。

您可以使用自己的解決方案,因爲它已經運行良好。如果你有興趣的替代解決方案,見下圖:

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

這使得生成的拆分即消失的空元素,因爲sub^\d+模式刪除所有領先的數字(^是字符串的開頭和\d+比賽1更多數字)。但是,它不健壯,因爲它使用了2個正則表達式。

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

這僅需要一個匹配正則表達式\D+ - 1個或多個非數字符號,並且一個外部庫。

如果你想要做基礎R類似的事情,使用regmatchesgregexpr

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