如何将内部有多个点的数字从字符转换为R中的数字?

如何将内部有多个点的数字从字符转换为R中的数字?,r,string,character,numeric,gsub,R,String,Character,Numeric,Gsub,我有一个向量x,如下所示 x= c("44.431.974.113.935", "-0.9780789132588046", "127.136.409.640.697", "-5.510.222.665.234.440", "4.254.952.168.752.070", "0.9009379347023327") 棘手的是,第一个点是有意义的,但其余的不是。所以我需要把x作为 [1] 44.43 -0.97 127.13 -5.51 4.25 0.9 我尝试使用gsub,但没有成功,并

我有一个向量x,如下所示

x= c("44.431.974.113.935", "-0.9780789132588046", "127.136.409.640.697", 
 "-5.510.222.665.234.440", "4.254.952.168.752.070", "0.9009379347023327")
棘手的是,第一个点是有意义的,但其余的不是。所以我需要把x作为

[1] 44.43 -0.97 127.13 -5.51 4.25 0.9

我尝试使用gsub,但没有成功,并且找不到如何以跳过第一个点并删除其余点的方式编写gsub。

必须有一种更漂亮的方式,但类似这样的方式应该可以:

gsub("^(.*?[.].*)?[.].*", "\\1", x)
## [1] "44.431"              "-0.9780789132588046" "127.136"            
## [4] "-5.510"              "4.254"               "0.9009379347023327" 
对于数值,将
包装为.numeric

round(as.numeric(gsub("^(.*?[.].*)?[.].*", "\\1", x)), 2)
## [1]  44.43  -0.98 127.14  -5.51   4.25   0.90

必须有一种更漂亮的方式,但像这样的方式应该有效:

gsub("^(.*?[.].*)?[.].*", "\\1", x)
## [1] "44.431"              "-0.9780789132588046" "127.136"            
## [4] "-5.510"              "4.254"               "0.9009379347023327" 
对于数值,将
包装为.numeric

round(as.numeric(gsub("^(.*?[.].*)?[.].*", "\\1", x)), 2)
## [1]  44.43  -0.98 127.14  -5.51   4.25   0.90

如果要删除除第一个点以外的所有点,一个技巧可能是用逗号替换第一个点,删除点,然后用点替换逗号。比如:

sub(",",".",gsub(".","",sub(".",",",x,fixed=TRUE),fixed=TRUE),fixed=TRUE)
#[1] "44.431974113935"     "-0.9780789132588046" "127.136409640697"   
#[4] "-5.510222665234440"  "4.254952168752070"   "0.9009379347023327"

然后,您可以根据自己的意愿将
称为.numeric
round

如果您想删除除第一个点以外的所有点,技巧可能是用逗号替换第一个点,删除点,然后用点替换逗号。比如:

sub(",",".",gsub(".","",sub(".",",",x,fixed=TRUE),fixed=TRUE),fixed=TRUE)
#[1] "44.431974113935"     "-0.9780789132588046" "127.136409640697"   
#[4] "-5.510222665234440"  "4.254952168752070"   "0.9009379347023327"

然后您可以按自己的意愿调用.numeric和
round

使用
stru-extract

library(stringr)
as.numeric(str_extract(x, '-*\\d+\\.[0-9]?[1-9]?'))
#[1]  44.43  -0.97 127.13  -5.51   4.25   0.90

使用
stru提取

library(stringr)
as.numeric(str_extract(x, '-*\\d+\\.[0-9]?[1-9]?'))
#[1]  44.43  -0.97 127.13  -5.51   4.25   0.90