我有一个大型的字符串向量:
Input = c("1,223", "12,232", "23,0")
等。也就是说,小数用逗号分隔,而不是句点。我想将此向量转换为数字向量。不幸的是,as.numeric(Input)
只输出NA
。
我的第一直觉是去strsplit
,但在我看来,这可能会非常缓慢。有没有人知道更快的选择?
现有的问题提示read.csv2
,但有问题的字符串不会以这种方式直接读取。
答案 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=",")
当其他所有方法都失败时,gsub
和sub
是您的朋友。
答案 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
仅替换第一个。