У меня есть вектор 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 таким образом, чтобы он пропускал первую точку и удалял остальные.

1
Homayoon 24 Дек 2015 в 15:10

3 ответа

Лучший ответ

Должен быть способ получше, но должно работать что-то вроде этого:

gsub("^(.*?[.].*)?[.].*", "\\1", x)
## [1] "44.431"              "-0.9780789132588046" "127.136"            
## [4] "-5.510"              "4.254"               "0.9009379347023327" 

Для числовых значений заключать в as.numeric:

round(as.numeric(gsub("^(.*?[.].*)?[.].*", "\\1", x)), 2)
## [1]  44.43  -0.98 127.14  -5.51   4.25   0.90
2
A5C1D2H2I1M1N2O1R2T1 24 Дек 2015 в 12:41

Используя str_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
0
akrun 24 Дек 2015 в 13:45

Если вы хотите удалить все точки, кроме первой, уловка может заключаться в том, чтобы заменить первую точку запятой, удалить точки, а затем заменить запятую точкой. Что-то типа:

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

Затем вы можете позвонить as.numeric и round по своему желанию.

1
nicola 24 Дек 2015 в 13:03