2013-10-08 17 views
5

ho una stringa come "3.1 ml" o "abc 3.1 xywazw"Estrazione numeri decimali da una stringa

mi piacerebbe estrarre "3.1" da questa stringa. Ho trovato molte domande sullo stackoverflow sull'estrazione di numeri da una stringa di caratteri, ma nessuna soluzione funziona nel caso di numeri decimali.

risposta

10

Questo approccio rende il punto decimale e frazione decimale opzionale e consente più numeri da estrarre:

str <- " test 3.1 test 5" 
as.numeric(unlist(regmatches(str, 
          gregexpr("[[:digit:]]+\\.*[[:digit:]]*",str)) 
     )  ) 
#[1] 3.1 5.0 

La preoccupazione per i numeri negativi può essere l'indirizzo con possibilità di stile perl look-ahead:

str <- " test -4.5 3.1 test 5" 
    as.numeric(unlist(regmatches(str,gregexpr("(?>-)*[[:digit:]]+\\.*[[:digit:]]*",str, perl=TRUE)))) 

#[1] -4.5 3.1 5.0 
+0

In effetti, funziona per molte situazioni, fantastico! –

+0

Modificato. Aveva la quantificazione di ripetizione sbagliata in prima. –

+0

Giusto. Grazie per la correzione. –

9

utilizzare la libreria stringr:

x<-"abc 3.1 xywazw" 
str_extract(x, "\\d+\\.*\\d*") 
[1] "3.1" 
+7

Forse usare '" \\ d + \\. \\ d + "' –

+0

Grazie. @RicardoSaporta ha ragione. Ad esempio, ciò non funzionerebbe per '13.1'. –

+1

E nessuno dei due avrebbe funzionato per "10". Non penso che il "+" sia il quantificatore di ripetizione giusto da utilizzare per la seconda o terza espressione. –

1

È possibile utilizzare le espressioni regolari:

> str <- " test 3.1 test" 
> as.numeric(regmatches(str,regexpr("[[:digit:]]+\\.[[:digit:]]+",str))) 
[1] 3.1 

regexpr restituisce la posizione iniziale e la lunghezza della stringa corrispondente. regmatches restituisce le partite. È quindi possibile convertirlo in un numero.

+0

La mia upvote era bloccata. Ho provato a capovolgerlo quando ho realizzato il "" veniva usato impropriamente. Deve essere sfuggito. Forse puoi correggere quell'errore e l'upvote verrà guadagnato. –

+0

@DWin Se si inserisce il testo "test 3p1 test", ad esempio, non corrisponde. Quindi non sono sicuro del "." deve essere scappato qui. –

+0

"3p1" è abbinato, ma poi convertito in NA da 'as.numeric'. –

Problemi correlati