2011-06-04 150 views
11

我有R數據,可以是這樣的:R中的正則表達式刪除第一個空格之後的所有字符?

USDZAR Curncy 
R157 Govt 
SPX Index 

換句話說,一個字,在這種情況下彭博安全標識符,後跟另一個字,它是安全類,用空格隔開。我想剝離類和空間去:

USDZAR 
R157 
SPX 

什麼是在R中這樣做的最有效的方式?它是正則表達式還是我必須做一些事情,就像我在MS Excel中使用mid和find命令一樣?例如,在Excel中,我會說:

=MID(@REF, 1, FIND(" ", @REF, 1)-1) 

這意味着返回一個字符串開始字符1,並在第一空間的字符數結束(少1抹去實際空間)。

我是否需要在R中做類似的事情(在這種情況下,什麼是等價的),或者正則表達式可以在這裏幫助嗎?謝謝。

回答

23

1)嘗試這其中的正則表達式的空間,隨後通過任意的字符序列,並sub匹配替換與具有零個字符的字符串:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 
sub(" .*", "", x) 
## [1] "USDZAR" "R157" "SPX" 

2)一種替代,如果你想數據幀中單獨列中的兩個單詞如下所示。這裏as.is = TRUE使列成爲字符而不是因數。

read.table(text = x, as.is = TRUE) 
##  V1  V2 
## 1 USDZAR Curncy 
## 2 R157 Govt 
## 3 SPX Index 
+0

非常感謝你。 – 2011-06-04 23:53:20

1

正則表達式將搜索:

\x20.* 

,並用一個空字符串替換。

如果你想知道它是否更快,只是時間它。

+0

謝謝,右所以我打字:( 「\ X20 *」, 「R157官立」)> grep和我找回:[1] 1,即價值1.我從哪裏去? – 2011-06-04 23:42:09

+0

這種類型的正則表達式不適用於R. – 2011-06-05 00:13:04

+0

該用法的問題是,您無法理解反斜槓在正則表達式中是特殊的,因此需要自行「逃脫」。在模式參數中需要有兩個baackslashes。試試:'sub(「\\\ x20。*」,「」,「R157 Govt」)' – 2012-01-06 13:52:35

2

如果你像我一樣,在正則表達式的將永遠是一個高深莫測,令人沮喪的神祕面紗,這個笨重的解決方案也存在:

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 
unlist(lapply(strsplit(x," ",fixed=TRUE),"[",1)) 

固定= TRUE不是絕對必要的,只是指出你可以做到這一點(簡單情況下),而不是真正瞭解有關正則表達式的第一件事。

編輯以反映@ Wojciech的評論。

+0

哈哈是的 - 謝謝喬蘭。 Clunk風格是我在Excel中習慣的,因此我想知道我是否應該(最終)學習正則表達式。 – 2011-06-05 01:27:41

+0

匿名函數在這裏沒有必要,所以你可以簡化爲unlist(lapply(strsplit(x,「」,fixed = TRUE),「[」,1))。 – 2011-06-05 08:03:17

+0

謝謝@Wojciech,我會相應地編輯... – joran 2011-06-05 13:49:05

4

這是很容易與stringr

x <- c("USDZAR Curncy", "R157 Govt", "SPX Index") 

library(stringr) 
str_split_fixed(x, " ", n = 2)[, 1] 
相關問題