2012-05-24 39 views
6

如果我有一個字符串,並希望拆分最後一位數字,並保留拆分hpw的最後一部分我可以這樣做嗎?分裂最後一次出現的數字,採取第二部分

x <- c("ID", paste0("X", 1:10, state.name[1:10])) 

我想

[1] NA   "Alabama"  "Alaska"  "Arizona"  "Arkansas" 
[6] "California" "Colorado" "Connecticut" "Delaware" "Florida"  
[11] "Georgia"  

但會滿足於:

[1] "ID"   "Alabama"  "Alaska"  "Arizona"  "Arkansas" 
[6] "California" "Colorado" "Connecticut" "Delaware" "Florida"  
[11] "Georgia"  

我可以得到由第一部分:

unlist(strsplit(x, "[^0-9]*$")) 

,但希望第二部分。

預先感謝您。

回答

2
library(stringr) 
unlist(lapply(str_split(x, "[0-9]"), tail,n=1)) 

[1] "ID"   "Alabama"  "Alaska"  "Arizona"  "Arkansas" "California" "Colorado" "Connecticut" "Delaware" 
[10] "Florida"  "Georgia" 

我想看看文檔stringr的(最有可能)一個更好的辦法。

+0

兩者你是第一個極好的選擇。謝謝。 –

+3

你可以在不加載stringr的情況下做同樣的事情:'sapply(strsplit(x,「[0-9]」),tail,n = 1)' – Dason

+0

@Dason - 這是一個簡潔易懂的解決方案。我總是忘記使用'tail'和'head' - 也許我應該在我的'.First'文件中寫一些說''不要忘記函數x,y,z - 簽名,我'的文件'' – thelatemail

2

這似乎有點笨重,但它的工作原理:

state.pt2 <- unlist(strsplit(x,"^.[0-9]+")) 
state.pt2[state.pt2!=""] 

這將是很好刪除字符串的開始被對手所產生的""的,但我不明白這一點。

下面是使用substrgregexpr太那個避免了於子集的結果的另一種方法:

substr(x,unlist(lapply(gregexpr("[0-9]",x),max))+1,nchar(x)) 
+0

做得好,在基地。我非常感激。 +1 –

+0

你有多禮貌! :-D – thelatemail

4

你可以做一個正則表達式這一個簡單的步驟:

gsub("(^.*\\d+)(\\w*)", "\\2", x) 

結果:

[1] "ID"   "Alabama"  "Alaska"  "Arizona"  "Arkansas" "California" "Colorado" "Connecticut" 
[9] "Delaware" "Florida"  "Georgia" 

正則表達式能做什麼:

  1. "(^.*\\d+)(\\w*)":尋找兩組人物。
    • 第一組(^.*\\d+)查找任何數字,然後在該字符串的開頭至少有一個數字。
    • 第二組\\w*尋找字母數字字符。
  2. "\\2"作爲gsub()的第二個參數意味着將原始字符串替換爲正則表達式找到的第二個組。
+0

我甚至演示了重新命名列名的重塑類似的東西。感謝提醒我,我是一個蠢貨。可能是最短的答案。很好的解釋,這正是很多正則表達式的答案。 +1 –

2

gsubfn

試試這個gsubfn解決方案:

> library(gsubfn) 
> strapply(x, ".*\\d(\\w*)|$", ~ if (nchar(z)) z else NA, simplify = TRUE) 
[1] NA   "Alabama"  "Alaska"  "Arizona"  "Arkansas" 
[6] "California" "Colorado" "Connecticut" "Delaware" "Florida"  
[11] "Georgia"  

它的最後一位數字後面文字字符,並返回字字符或如果失敗行的末尾匹配(以確保它匹配一些東西)。如果第一場比賽成功,然後返回;否則,反向參考將爲空,因此返回NA。

請注意,該公式是編寫函數function(z) if (nchar(z)) z else NA的簡短方式,該函數可以交替替換公式,代價是稍微更多的擊鍵次數。

GSUB

類似的策略也可以工作,只用直gsub但需要兩條線和一個稍微更復雜的正則表達式。這裏我們使用的第二個選擇從第一替代啜了不匹配:

> s <- gsub(".*\\d(\\w*)|.*", "\\1", x) 
> ifelse(nchar(s), s, NA) 
[1] NA   "Alabama"  "Alaska"  "Arizona"  "Arkansas" 
[6] "California" "Colorado" "Connecticut" "Delaware" "Florida"  
[11] "Georgia"  

編輯:小的改進

+0

非常感謝,並獲得NA。非常短+1 –

相關問題