2016-09-07 66 views
1

我有R中的郵政編碼數據,看起來像這樣:的R - 空格後,分割字符串的一種字符

Postcodes 
AB4 6JK 
AR14 8UI 
D4 9IK 
CB3 9EU 

但我要拆分的郵政編碼爲郵編部門,其中包括空間之後的所有一個字符,讓他們看起來像這樣:

Postcodes 
AB4 6 
AR14 8 
D4 9 
CB3 9 

我發現許多Q &的作爲專注於分離出基於空格的字符串,如herehere,但我怎麼指定打出一個字符AFTE空間?

該郵編不是固定的長度。

我打算根據更高級別的郵政編碼部門來彙總郵政編碼數據。

回答

4

您可以使用sub來嘗試以下正則表達式方法。它創建一個捕獲組並從字符串中提取它。

假設你的數據被稱爲x

x <- read.table(header=TRUE,text="Postcodes 
       'AB4 6JK' 
       'AR14 8UI' 
       'D4 9IK' 
       'CB3 9EU'") 

的做法可能是這樣的:

sub("^(.*\\s.).*", "\\1", x$Postcodes) 
# [1] "AB4 6" "AR14 8" "D4 9" "CB3 9" 

的模式是:字符串(^)的開頭,後跟任意字符( (.*))後跟一個空格(\\s)和一個附加字符(.) - 它們一起構成捕獲組。另外,以下任何內容都不屬於捕獲組的一部分。

請注意,如果你有多個空格的字符串,將做到以下幾點:

sub("^(.*\\s.).*", "\\1", "abc def 981") 
#[1] "abc def 9" 
+0

這工作,謝謝! –

1

您可以使用正回顧後發正則表達式是由前面有一個空格號碼後分裂。

strsplit(postcode,"(?<= [0-9])",perl=TRUE) 

要獲得分割字符串的第一部分:

sapply(strsplit(postcode,"(?<= [0-9])",perl=TRUE),'[[',1) 
#[1] "AB4 6" "AR14 8" "D4 9" "CB3 9" 
0

你也可以這樣做:

lapply(strsplit(as.character(Postcodes), " "), function(x) paste(x[1], substr(x[2],0,1))) 
+1

你也可以在沒有循環的情況下做到這一點,即粘貼(gsub('\\ s +。*','',x $ Postcodes),substring(gsub('。* \\ s +','' x $ Postcodes),1,1))' – Sotos