2015-04-20 11 views
5

Mam kolumnę zawierającą wartości 3 ciągi oddzielone średnikami. Muszę tylko wyodrębnić pierwszą część ciągu.Wyciągnij część ciągu (do pierwszego średnika) w R

Type <- c("SNSR_RMIN_PSX150Y_CSH;SP_12;I0.00V50HX0HY3000") 

Czego chcę: Pobierz pierwszą część ciągu (do pierwszego średnika).

wyjściowa: SNSR_RMIN_PSX150Y_CSH

Próbowałem gsub, ale nie jest w stanie zrozumieć. Prosimy daj mi znać, jak możemy to zrobić skutecznie w R.

Odpowiedz

6

Można spróbować sub

sub(';.*$','', Type) 
#[1] "SNSR_RMIN_PSX150Y_CSH" 

będzie pasować do wzorca czyli pierwszego wystąpienia ; do końca łańcucha i zastąpić ''

Albo użyć

library(stringi) 
stri_extract(Type, regex='[^;]*') 
#[1] "SNSR_RMIN_PSX150Y_CSH" 
+0

Dzięki. Działa szybko, nawet przy dużych zbiorach danych. – Sharath

+0

@Sharath Bez problemu. Myślę, że 'stringi' powinno być szybsze. Zaktualizowany jedną opcją, sprawdź czy jest szybki – akrun

+0

"stringi" działa bardzo szybko. Dziękuję za wskazanie. – Sharath

3

można również użyć strsplit

strsplit(Type, ";")[[1]][1] 
[1] "SNSR_RMIN_PSX150Y_CSH" 
+0

Dzięki. Działa dobrze. – Sharath

+0

serdecznie zapraszamy :) –

4

stringi pakiet działa bardzo szybko tutaj:

stri_extract_first_regex(Type, "^[^;]+") 
## [1] "SNSR_RMIN_PSX150Y_CSH" 

I odwzorować na 3 głównych podejść tutaj:

Unit: milliseconds 
     expr  min  lq  mean median  uq  max neval 
    SAPPLY() 254.88442 267.79469 294.12715 277.4518 325.91576 419.6435 100 
    SUB() 182.64996 186.26583 192.99277 188.6128 197.17154 237.9886 100 
STRINGI() 89.45826 91.05954 94.11195 91.9424 94.58421 124.4689 100 

enter image description here Oto kod dla benchmarków:

library(stringi) 
SAPPLY <- function() sapply(strsplit(Type, ";"), "[[", 1) 
SUB <- function() sub(';.*$','', Type) 
STRINGI <- function() stri_extract_first_regex(Type, "^[^;]+") 

Type <- c("SNSR_RMIN_PSX150Y_CSH;SP_12;I0.00V50HX0HY3000") 
Type <- rep(Type, 100000) 

library(microbenchmark) 
microbenchmark( 
    SAPPLY(), 
    SUB(), 
    STRINGI(), 
times=100L) 
+0

Tęskniłem za edycją akruna (mniej więcej tak samo jak moje podejście). Zostawię na benchmarku –

+0

Dzięki Tyler. biblioteka "stringi" jest szybka i zamierzam jej użyć zamiast sub. – Sharath

+0

Czy to ma wpływ na użycie 'stri_extract_first_regex' kontra' stri_extract' i określenie regex w środku. – akrun

Powiązane problemy