2011-06-04 11 views
11

Iは次のように見ることができるRのデータを有する:Rの正規表現は、最初のスペースの後にすべての文字を消去しますか?

USDZAR Curncy 
R157 Govt 
SPX Index 
すなわち

1つのワード、この場合スペースで区切られたセキュリティ・クラス別の単語、続いブルームバーグセキュリティ識別子を、 。

USDZAR 
R157 
SPX 

Rでこれを行う最も効率的な方法は何ですか?それは正規表現ですか、私はミッドと検索のコマンドを使用してMS Excelのように何かをする必要がありますか?例えば、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を、あなたが望んでいた場合)選択肢をデータフレーム内の別々の列にある2つの単語は次のとおりです。ここではas.is = TRUEは、列を因数ではなく文字にします。

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

ありがとうございます。 –

1

正規表現を検索するために、次のようになります。

\x20.* 

と空の文字列に置き換えます。

それが速いかどうかを知りたい場合は、時間をかけてください。

+0

おかげで、右ので、私は入力しています:>はgrep( "\のX20 *。"、 "R157政府")を、私は戻って取得しています:[1] 1、つまり値1。どこから行くのですか? –

+0

このタイプの正規表現はRでうまく動作しません。 –

+0

その使用上の問題は、バックスラッシュが正規表現では特殊であるため、「エスケープ」する必要があることを理解できなかったことでした。また、パターン引数の前に2つのbaackslashesが必要です。試してください: 'sub(" \\\ x20。* "、" "、" R157 Govt ")' –

2

あなたが私に似ている場合は、その正規表現のいつも不可解な、イライラ謎のままで、このclunkierソリューションも存在する:

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

を固定= TRUEだけで、厳密には必要ではありませんあなたがこれ(単純な場合)を行うことができます/実際に正規表現についての最初のことを知っていることを指摘します。

@ Wojciechのコメントを反映するように編集されました。

+0

haha​​はい - ありがとうジョラン。 Clunkスタイルは、私がExcelで慣れていたものなので、(最終的に)正規表現を学ぶべきかどうか疑問に思っていました。 –

+0

ここでは匿名関数は必要ないので、unappすることができます(lapply(strsplit(x、 ""、fixed = TRUE)、 "["、1))。 –

+0

ありがとう@Wojciech、私はそれに応じて編集します... – joran

4

それはstringrと非常に簡単です:

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

library(stringr) 
str_split_fixed(x, " ", n = 2)[, 1] 
関連する問題