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

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)

应该管用.

  • @adibender这可能是真的,但SO的目的是帮助一般社区,而不是一个人.最通用的解决方案是最好的.回答OP问题的目的是保持关注不是因为答案仅适用于狭隘的案例. (5认同)
  • 如果有两个逗号,它将无法正常工作 (4认同)

小智 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)


Ric*_*rta 6

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

read.table("file.txt", dec=",")
Run Code Online (Sandbox Code Playgroud)

当一切都失败了,gsub而且sub是你的朋友。