带逗号小数分隔符的as.numeric?

时间:2013-03-05 23:53:38

标签: string r number-formatting

我有一个大型的字符串向量:

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

等。也就是说,小数用逗号分隔,而不是句点。我想将此向量转换为数字向量。不幸的是,as.numeric(Input)只输出NA

我的第一直觉是去strsplit,但在我看来,这可能会非常缓慢。有没有人知道更快的选择?

现有的问题提示read.csv2,但有问题的字符串不会以这种方式直接读取。

7 个答案:

答案 0 :(得分:47)

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

应该有用。

答案 1 :(得分: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

答案 2 :(得分:4)

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

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

当其他所有方法都失败时,gsubsub是您的朋友。

答案 3 :(得分:4)

在@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
                ))

我想这是一个更安全的比赛...

答案 4 :(得分:2)

如上所述,导入文件时更容易做到这一点。 最近发布的reads包有一个非常有用的功能,locale,很好地解释here,允许用户使用locale = locale(decimal_mark = ",")作为参数导入带逗号小数点的数字。< / p>

答案 5 :(得分:0)

readr包具有解析字符串中的数字的功能。您可以通过locale参数设置许多选项。

对于逗号作为小数点分隔符,您可以编写:

readr::parse_number(Input, locale = readr::locale(decimal_mark = ","))

答案 6 :(得分:-1)

如果有多个逗号,则adibender的答案无效。

在这种情况下,可以使用use554546的建议和Deena的答案。

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

输出:

[1] 1223765 122325000 23054

函数gsub替换所有出现的事件。函数sub仅替换第一个。