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

此外,如果您正在读取原始数据,则 theread.table和所有相关函数都有一个dec参数。例如:

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

当一切都失败时,gsubsub你的朋友。

于 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

如前所述,在导入文件时执行此操作要容易得多。Thw 最近发布的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 回答