2013-10-08 11 views

Odpowiedz

10

Takie podejście sprawia, że ​​punkt dziesiętny i ułamek dziesiętny opcjonalne i umożliwia wielokrotne numery do ekstrakcji:

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

Troska o liczbach ujemnych może być adres z opcjonalnym stylu Perl antycypowana:

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

Rzeczywiście działa to w wielu sytuacjach, fantastycznie! –

+0

Edytowano. Wcześniej miał nieprawidłowy kwantyfikator powtórzeń. –

+0

Dobrze. Dziękuję za poprawienie mnie. –

9

Użyj stringr Biblioteka:

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

Możliwe użycie '' \\ d + \\. \\ d + "' –

+0

Dziękuję. @RicardoSaporta ma rację. Na przykład nie działa to dla '13.1'. –

+1

Żadna z nich nie zadziała na "10". Nie sądzę, że "+" jest właściwym kwantyfikatorem powtórzeń do użycia dla drugiego lub trzeciego wyrażenia. –

1

Można użyć wyrażeń regularnych:

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

regexpr zwraca pozycję początkową i długość dopasowanego łańcucha. regmatches zwraca dopasowania. Możesz następnie przekonwertować go na liczbę.

+0

Mój awans został zablokowany. Próbowałem go odwrócić, gdy zdałem sobie sprawę, że "." był niewłaściwie używany. To musi być uciekł. Być może uda ci się naprawić ten błąd, a wtedy zostanie pobrane upto. –

+0

@DWin Jeśli na przykład wprowadzisz tekst "test testu 3p1", nie zostanie on dopasowany. Więc nie jestem pewien "." tutaj trzeba uciec. –

+0

"3p1" jest dopasowywany, ale następnie konwertowany na NA przez "as.numeric". –

Powiązane problemy