48

次の形式の文字列の大きなベクトルがあります。

Input = c("1,223", "12,232", "23,0")

つまり、ピリオドではなく、コンマで区切られた小数です。このベクトルを数値ベクトルに変換したいと思います。残念ながら、as.numeric(Input)出力するだけNAです。

私の最初の本能はに行くことstrsplitですが、これはおそらく非常に遅いと思われます。誰かがより速いオプションのアイデアを持っていますか?

を示唆する既存の質問read.csv2がありますが、問題の文字列はそのように直接読み取られません。

4

7 に答える 7

67
as.numeric(sub(",", ".", Input, fixed = TRUE))

動作するはずです。

于 2013-03-05T23:55:51.000 に答える
16

このreadrパッケージには、文字列から数値を解析する機能があります。locale引数を介して多くのオプションを設定できます。

小数点記号としてのコンマの場合、次のように記述できます。

readr::parse_number(Input, locale = readr::locale(decimal_mark = ","))
于 2019-03-14T14:19:58.570 に答える
12
scan(text=Input, dec=",")
## [1]  1.223 12.232 23.000

ただし、ベクトルの長さによって異なります。以前rep(Input, 1e6)は長いベクトルを作成していましたが、マシンがハングします。1e4でも大丈夫です。@adibenderのソリューションははるかに高速です。1e4で実行すると、はるかに高速になります。

Unit: milliseconds
         expr        min         lq     median         uq        max neval
  adibender()   6.777888   6.998243   7.119136   7.198374   8.149826   100
 sebastianc() 504.987879 507.464611 508.757161 510.732661 517.422254   100
于 2013-03-06T01:04:06.373 に答える
9

また、生データを読み込んでいる場合は、read.tableおよび関連するすべての関数にdec引数があります。例えば:

read.table("file.txt", dec=",")

他のすべてが失敗したとき、gsubそしてsubあなたの友達です。

于 2013-03-06T00:19:54.110 に答える
3

@adibenderソリューションに基づいて構築:

input = '23,67'
as.numeric(gsub(
                # ONLY for strings containing numerics, comma, numerics
                "^([0-9]+),([0-9]+)$", 
                # Substitute by the first part, dot, second part
                "\\1.\\2", 
                input
                ))

私はそれがより安全な試合だと思います...

于 2016-07-05T14:32:37.977 に答える
2

で述べたように、ファイルのインポート中にこれを行う方がはるかに簡単です。最近リリースされたreadsパッケージには、非常に便利な機能があります。ここlocaleで詳しく説明します。これにより、ユーザーは引数としてコンマ小数点を使用して数値をインポートできます。locale = locale(decimal_mark = ",")

于 2016-11-09T17:15:19.173 に答える
1

複数のコンマがある場合、adibenderによる回答は機能しません。

その場合、use554546からの提案とDeenaからの回答を使用できます。

Input = c("1,223,765", "122,325,000", "23,054")
as.numeric(gsub("," ,"", Input))

出力:

[1] 1223765 122325000 23054

この関数gsubは、すべてのオカレンスを置き換えます。この関数subは最初のものだけを置き換えます。

于 2018-12-16T14:37:18.583 に答える