2015-04-20 4 views
5

Ich habe eine Spalte mit Werten von 3 Zeichenfolgen getrennt durch Semikolons. Ich muss nur den ersten Teil der Zeichenfolge extrahieren.Teil der Zeichenfolge extrahieren (bis zum ersten Semikolon) in R

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

Was ich will ist: Holen Sie sich den ersten Teil der Zeichenfolge (bis zum ersten Semikolon).

Ausgang: SNSR_RMIN_PSX150Y_CSH

ich gsub versucht, aber nicht in der Lage zu verstehen. Bitte lassen Sie mich wissen, wie wir diese

in R. effizient tun können

Antwort

6

Sie sub

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

könnten versuchen, es wird das Muster, dh erste Auftreten von ; bis zum Ende des Strings passen und ersetzen mit ''

Oder verwenden

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

Danke. Funktioniert auch bei großen Datenmengen schnell. – Sharath

+0

@Sharath Kein Problem. Ich denke 'Stringi' sollte schneller sein. Aktualisiert mit einer Option, überprüfen Sie bitte, ob das schnell ist – akrun

+0

'Stringi' arbeitet sehr schnell. Danke, dass du es aufgezeigt hast. – Sharath

3

Sie auch strsplit können

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

Danke. Funktioniert gut. – Sharath

+0

Sie sind herzlich willkommen :) –

4

Das stringi Paket arbeitet sehr schnell hier:

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

ich auf den 3 hier wichtigsten Ansätze gebenchmarkt:

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 Hier ist der Code für die Benchmarks:

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

Ich vermisste die Bearbeitung von akrun (etwa das gleiche wie mein Ansatz) Ich werde für den Benchmark gehen –

+0

Thanks Tyler. Die 'stringi' Bibliothek ist schnell und ich werde das anstelle von sub verwenden. – Sharath

+0

Würde es einen Unterschied machen, wenn man 'stri_extract_first_regex' gegen' stri_extract' verwendet und die Regex darin spezifiziert. – akrun