2014-05-08 13 views
8

Mam wektor znaków d ze znaków alfanumerycznychUsuwanie zer wiodących od znaków alfanumerycznych w R

d <- c("template", "separate 00340", "00045", "890 098", "3405 garage", "matter00908") 

d 
[1] "template" "separate 00340" "00045"   "890 098"   "3405 garage"  "matter00908" 

Jak mogę usunąć zera ze wszystkich liczb w R? as.numeric usunie wszystkie początkowe zera tylko w wektorach liczbowych lub całkowitych. Próbowałem gsub z regex, ale nie mogłem uzyskać pożądanych rezultatów.

oczekiwany wynik jest następujący

out <- c("12309 template", "seperate 340", "45", "890 98", "3405 garage", "matter908") 
out 
[1] "12309 template" "seperate 340" "45"    "890 98"   "3405 garage" "matter908" 

Odpowiedz

13

Można użyć negatywny lookbehind wyeliminować 0, chyba że poprzedzone cyfrą:

> d <- c("100001", "template", "separate 00340", "00045", "890 098", "3405 garage", "matter00908") 
> gsub("(?<![0-9])0+", "", d, perl = TRUE) 
[1] "100001"   "12309 template" "separate 340" "45"    
[5] "890 98"   "3405 garage" "matter908"  

Innym sposobem korzystania regex:

> gsub("(^|[^0-9])0+", "\\1", d, perl = TRUE) 
[1] "100001"   "12309 template" "separate 340" "45"    
[5] "890 98"   "3405 garage" "matter908"  
> 
+0

To również usuwa wiele zer w ciągu znaków numerycznych, np. 100001 do 101. – Crops

+1

@Crops Należy teraz naprawić. – devnull

7

Oto rozwiązanie wykorzystując stri_replace_all_regex z pakietu stringi:

d <- c("template", "separate 00340", "00045", 
     "890 098", "3405 garage", "matter00908") 
library("stringi") 
stri_replace_all_regex(d, "\\b0*(\\d+)\\b", "$1") 
## [1] "12309 template" "separate 340" "45"    "890 98" 
## [5] "3405 garage" "matter00908" 

Objaśnienie: Jesteśmy dopasowując wszystkie sekwencje cyfr w granicach słowa (\b). Zera końcowe są dopasowywane chciwie (0+). Pozostałe cyfry (\d oznaczają dowolną cyfrę, \d+ oznaczają ich niepustą sekwencję) są przechwytywane w grupie ((...)). Następnie zastępujemy wszystkie takie mecze tylko materiałem przechwyconym przez grupę.

Gdybyś również chcą usunąć 0s ciągu słów (jak w przykładzie), po prostu pominąć \b i zadzwonić:

stri_replace_all_regex(d, "0*(\\d+)", "$1") 
## [1] "12309 template" "separate 340" "45"    "890 98" 
## [5] "3405 garage" "matter908" 
+0

Co o '\\ d +'? –

+1

edytowane: * '\ d' oznacza dowolną cyfrę,' \ d + 'oznacza ich niepustą sekwencję * – gagolews

Powiązane problemy