Fhn*_*oag 36 string r number-formatting
我有一个大型的字符串向量形式:
Input = c("1,223", "12,232", "23,0")
Run Code Online (Sandbox Code Playgroud)
等等,也就是说,用逗号分隔的小数,而不是句点.我想将此向量转换为数字向量.不幸的是,as.numeric(Input)只是输出NA.
我的第一直觉是去strsplit,但在我看来,这可能会非常缓慢.有没有人知道更快的选择?
有一个现有的问题表明read.csv2,但有问题的字符串不是以这种方式直接读取的.
adi*_*der 52
as.numeric(sub(",", ".", Input, fixed = TRUE))
Run Code Online (Sandbox Code Playgroud)
应该管用.
小智 14
该readr包具有从字符串解析数字的功能。您可以通过locale参数设置许多选项。
对于逗号作为小数点分隔符,您可以这样写:
readr::parse_number(Input, locale = readr::locale(decimal_mark = ","))
Run Code Online (Sandbox Code Playgroud)
seb*_*n-c 12
scan(text=Input, dec=",")
## [1] 1.223 12.232 23.000
Run Code Online (Sandbox Code Playgroud)
但这取决于你的矢量有多长.我曾经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
Run Code Online (Sandbox Code Playgroud)
另外,如果您正在读取原始数据,则read.table和所有关联的函数都有一个dec参数。例如:
read.table("file.txt", dec=",")
Run Code Online (Sandbox Code Playgroud)
当一切都失败了,gsub而且sub是你的朋友。