2012-10-04 10 views
10

Wyobraźmy sobie, że masz ciąg:wyodrębnić wszystkie numery z jednym ciągiem w R

strLine <- "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)" 

Czy istnieje funkcja, która pozbawia się numery na tablicy/produkującej następujące wymagane rozwiązanie Vector:

result <- c(0, 3000, -500, 0, 2.25, -1200)? 

tj

result[3] = -500 

zawiadomieniu, numery są przedstawiane w formie rachunkowości numery tak negatywne appe ar pomiędzy(). Można również założyć, że tylko liczby pojawiają się na prawo od pierwszego wystąpienia liczby. Nie jestem tak dobry w regexp, więc byłbym wdzięczny, gdybyś mógł pomóc, gdyby to było wymagane. Ponadto nie chcę założyć, że ciąg jest zawsze taki sam, dlatego staram się usunąć wszystkie słowa (i wszelkie znaki specjalne) przed położeniem pierwszego numeru.

Odpowiedz

24
library(stringr) 
x <- str_extract_all(strLine,"\\(?[0-9,.]+\\)?")[[1]] 
> x 
[1] "0"  "3,000" "(500)" "0"  "2.25" "(1,200)" 

Zmień parens do negatywów:

x <- gsub("\\((.+)\\)","-\\1",x) 
x 
[1] "0"  "3,000" "-500" "0"  "2.25" "-1,200" 

A potem as.numeric() lub taRifx::destring skończyć (na next version z destring wesprze negatywy domyślnie opcja keep tak nie będzie to konieczne):

library(taRifx) 
destring(x, keep="0-9.-") 
[1] 0 3000 -500 0 2.25 -1200 

LUB:

as.numeric(gsub(",","",x)) 
[1]  0 3000 -500  0  2.25 -1200 
+0

Hej, brakuje Ci okresu w pierwszym wyliczeniu. Wynik powinien mieć wartość 2,25, a nie 2 i 25. –

+0

@mplourde Ups! Dziękuję za wskazanie tego. –

+0

To jest przerażające. Twoje wyrażenie regularne działa tak, jak chciałem. Próbowałem jak, 5 wyrażeń regularnych i żadne nie wprowadzają wartości niezależnie od znaku dziesiętnego (.,,), Twojego. Dzięki! –

17

Oto sposób baza R, w trosce o kompletność ...

x <- unlist(regmatches(strLine, gregexpr('\\(?[0-9,.]+', strLine))) 
x <- as.numeric(gsub('\\(', '-', gsub(',', '', x))) 
[1]  0.00 3000.00 -500.00  0.00  2.25 -1200.00 
+0

Dziękuję. Obie odpowiedzi są zwięzłe i tego, czego szukałem. – Bertie

+0

Usuń kropkę i drugi przecinek z pierwszego wiersza, jeśli wiesz, że wszystkie liczby są> 0, na przykład, gdy nazwy kolumn są ponumerowane w następujący sposób: "col.1 col.2 col.3". –

+0

co, jeśli chciałbym mieć to w inny sposób. Mam ramki danych z wartościami ujemnymi chcę zastąpić je(). proszę pomóc –

0

Co dla mnie doskonale pracował podczas pracy na pojedynczych strun w data frame (jeden ciąg za rzędu w tej samej kolumnie) był następujące:

library(taRifx) 
DataFrame$Numbers<-as.character(destring(DataFrame$Strings, keep="0-9.-")) 

Wyniki są w nowej kolumnie z tego samego data frame.

Powiązane problemy