文字列内の特定の文字を置き換える


262

Excelの検索と置換機能同様に、ベクトル内の文字列から特定の文字を削除したいと思います。

ここに私が始めるデータがあります:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

最初の列だけから始めます。を削除して2番目の列を作成しますe

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

回答:


399

正規表現と関数でgsub()

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

gsubここで行うことは、各発生を置き換えることで"e"、空の文字列で""


詳細については、?regexpまたはgsubを参照してください。


15
fixed = TRUEこれを速くするでしょう。
Rich Scriven 2016年

4
@RichScrivenはなぜ簡単に説明できますか?
16

6
fixed=TRUERが正規表現を使用しないようにします。これにより、より柔軟なパターンマッチングが可能になりますが、計算に時間がかかります。必要なのが単一の定数文字列「e」を削除することだけであれば、それらは必要ありません。
mm689 2016年

だろうsub("e", "", group)と同じ結果を保持?
Matheus Santana

e各要素で最初に見つかったものを置き換えるだけです
sindri_baldur

47

正規表現はあなたの友達です:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

次にgsub()、最も単純な置換パターンで使用します。空の文字列:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 

3
また...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
ディコア

26
さて、「ベース関数を理解していない人は、それらを置き換える運命にある」とスニッケするかもしれません。ソースファイルでアンダースコアの数を増やす以外に、ここでストリンガーは正確に何を取得しますか?
Dirk Eddelbuettel 2012

8
ストリンガーは、Rのストリング関数をより一貫性のある、シンプルで使いやすいものにする一連の単純なラッパーです。したがって、あなたの言うことが真実である場合(多くのアンダースコアがベース関数をラップするために...)このパッケージが存在する理由はありません(免責事項:私は主にベース正規表現関数を使用しますが、新しいユーザーにとって難しい場合があることを知っています... )
ディコア2012

17
@dickoa:str_replacewraps subなので、パターンの最初の出現のみを置き換えます。str_replace_allと同じ動作が必要な場合は、を使用する必要がありますgsub
ジョシュアウルリッヒ

24

文字列を置き換える2つの方法の要約:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1)使用 gsub

group$group.no.e <- gsub("e", "", group$group)

2)stringrパッケージを使用する

group$group.no.e <- str_replace_all(group$group, "e", "")

どちらも欲望の出力を生成します:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

3
当時は、コメントで説明されていたストリンガーの構文を学ぶために、コメントを含むページ全体を読む必要がありました。このソリューションはすぐに両方のオプションを提示するため、私がそれを提供したのはそのためです。私はR.私に新しかったときに実行する必要がありましたように私の希望は非常に介して他のユーザーフィルタを助けることだったstringrを見つける前にGSUBに苦労しているため、それが非常にupvoted答えで言及されていませんでした。繰り返しますが、目的は賛成票を集めることではなく、新しいRユーザーを支援することです。
メガトロン2017年

他の回答/コメントに役立つ情報があり、回答に変換したい場合は、少なくとも情報を提供して、情報をどこから取得したか、または回答をComminuty Wikiにするだけでなく、Comminuty Wikiにすることができますあなた自身の。
デビッドアレンブルク2017年

ありがとう-次回のために覚えておきます。これまでにコミュニティーWikiを作成したことがないため、それがオプションであることを知りませんでした。
メガトロン

1
オプション2は、列内のすべての値を指定せずに、データフレーム内のデータの列に適用するとうまく機能します。明らかに、オプション1は繰り返しですが、オプション2は非常にうまく機能し、追加された機能には賛成票を投じる価値があります。
Phil_T

6

文字列の一部の文字を置き換える場合は、文字列のベクトルからデータフレームを作成する必要はありません。正規表現は、@ Andrieと@Dirk Eddelbuettelによって既に言及されているため、適切な選択です。

ドットなどの特殊文字を置き換える場合は、以下の例に示すように、完全な正規表現構文を使用する必要があります。

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

これは生成されます

[1] "Czech Republic" "New Zealand"    "Great Britain" 

あなたはちょうどそれらをエスケープすることができますが、それは引用符でだからあなたもエスケープ文字としてエスケープする必要があります:gsub("\\.", " ", ctr_names)
カミルSジャロン

4

stringiパッケージを使用します。

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"

0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.