我有一个很大的字符串向量,形式如下:
Input = c("1,223", "12,232", "23,0")
等等。也就是说,用逗号分隔的小数,而不是句点。我想将此向量转换为数值向量。不幸的是,as.numeric(Input)
只是输出NA
.
我的第一直觉是去strsplit
,但在我看来,这可能会很慢。有人知道更快的选择吗?
有一个现有的问题表明read.csv2
,但有问题的字符串不是以这种方式直接读取的。
我有一个很大的字符串向量,形式如下:
Input = c("1,223", "12,232", "23,0")
等等。也就是说,用逗号分隔的小数,而不是句点。我想将此向量转换为数值向量。不幸的是,as.numeric(Input)
只是输出NA
.
我的第一直觉是去strsplit
,但在我看来,这可能会很慢。有人知道更快的选择吗?
有一个现有的问题表明read.csv2
,但有问题的字符串不是以这种方式直接读取的。
as.numeric(sub(",", ".", Input, fixed = TRUE))
应该管用。
该readr
包具有从字符串中解析数字的功能。locale
您可以通过参数设置许多选项。
对于逗号作为小数分隔符,您可以编写:
readr::parse_number(Input, locale = readr::locale(decimal_mark = ","))
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
此外,如果您正在读取原始数据,则 theread.table
和所有相关函数都有一个dec
参数。例如:
read.table("file.txt", dec=",")
当一切都失败时,gsub
是sub
你的朋友。
基于@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
))
我想这是一个更安全的比赛......
当有多个逗号时,adibender 的答案不起作用。
在这种情况下,可以使用 use554546 的建议和 Deena 的回答。
Input = c("1,223,765", "122,325,000", "23,054")
as.numeric(gsub("," ,"", Input))
输出:
[1] 1223765 122325000 23054
该函数gsub
替换所有出现。该函数sub
仅替换第一个。