如何将内部有多个点的数字从字符转换为R中的数字?
我有一个向量x,如下所示如何将内部有多个点的数字从字符转换为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= 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