7

文字列内の残りのコンマに影響を与えずに、文字列の数字部分からコンマを削除するにはどうすればよいですか (最速が望ましい)。したがって、以下の例では、数字の部分からコンマを削除したいのですが、犬の後のコンマはそのままにしておく必要があります (はい、1023455 のコンマが間違っていることはわかっていますが、コーナーケースを投げるだけです)。

私が持っているもの:

x <- "I want to see 102,345,5 dogs, but not too soo; it's 3,242 minutes away"

望ましい結果:

[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"

規定: ベースなしのアドオン パッケージで実行する必要があります。

前もって感謝します。

編集: Dason、Greg、Dirk に感謝します。どちらの回答も非常にうまくいきました。Dasonの応答に近いもので遊んでいましたが、括弧内にコンマがありました. 今見ても意味不明。ここで速度が必要なので、両方の応答をマイクロベンチマークしました(テキストデータ):

Unit: microseconds
         expr     min      lq  median      uq     max
1  Dason_0to9  14.461  15.395  15.861  16.328  25.191
2 Dason_digit  21.926  23.791  24.258  24.725  65.777
3        Dirk 127.354 128.287 128.754 129.686 154.410
4      Greg_1  18.193  19.126  19.127  19.594  27.990
5      Greg_2 125.021 125.954 126.421 127.353 185.666

皆様に+1。

4

3 に答える 3

9

パターン (コンマの後に数字が続く) を持つものはすべて、数字そのものに置き換えることができます。

x <- "I want to see 102,345,5 dogs, but not too soo; it's 3,242 minutes away"
gsub(",([[:digit:]])", "\\1", x)
#[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"
#or
gsub(",([0-9])", "\\1", x)
#[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"
于 2012-08-25T23:59:40.787 に答える
7

Perl正規表現を使用し、「数字のコンマ数字」に焦点を当てて、数字だけに置き換えます。

R> x <- "I want to see 102,345,5 dogs, but not too soo; it's 3,242 minutes away"
R> gsub("(\\d),(\\d)", "\\1\\2", x, perl=TRUE)
[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"
R> 
于 2012-08-26T00:08:00.797 に答える
6

以下にいくつかのオプションを示します。

> tmp <- "I want to see 102,345,5 dogs, but not too soo; it's 3,242 minutes away"
> gsub('([0-9]),([0-9])','\\1\\2', tmp )
[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"
> gsub('(?<=\\d),(?=\\d)','',tmp, perl=TRUE)
[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"
> 

どちらも、数字の後にカンマが続き、数字が続くものと一致します。[0-9]and \d(エクストラは 2 番目の\ものをエスケープして、正規表現を通過させます) はどちらも 1 桁に一致します。

最初の式は、コンマの前の数字とコンマの後の数字をキャプチャし、置換文字列で使用します。基本的にそれらを引き出して元に戻します(ただし、コンマを元に戻すことはありません)。

2 番目のバージョンでは長さ 0 の一致が使用されます。一致(?<=\\d)するにはコンマの前に 1 つの数字が必要であると書かれていますが、数字自体は一致の一部ではありません。は(?=\\d)、一致するためにコンマの後に数字が必要であると述べていますが、一致には含まれていません。したがって、基本的にはカンマに一致しますが、前後に数字が続く場合に限ります。コンマのみが一致するため、置換文字列は空になり、コンマが削除されます。

于 2012-08-26T01:27:53.223 に答える