2015-04-20 18 views
5

Ho una colonna contenente valori di 3 stringhe separate da punto e virgola. Ho bisogno di estrarre solo la prima parte della stringa.Estrai parte della stringa (fino al primo punto e virgola) in R

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

Quello che voglio è: Ottenere la prima parte della stringa (fino al primo punto e virgola).

uscita: SNSR_RMIN_PSX150Y_CSH

ho provato gsub ma non in grado di capire. Gentilmente vorrei sapere come possiamo farlo in modo efficiente in R.

risposta

6

Si potrebbe provare sub

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

Sarà abbinare il modello cioè prima occorrenza del ; alla fine della stringa e sostituirlo con ''

O utilizzare

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

Grazie. Funziona velocemente anche con grandi set di dati. – Sharath

+0

@Sharath Nessun problema. Penso che 'stringi' dovrebbe essere più veloce. Aggiornato con un'opzione, controlla se è veloce. – akrun

+0

'stringi' funziona molto velocemente. Grazie per segnalarlo. – Sharath

3

è anche possibile usare strsplit

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

Grazie. Funziona bene. – Sharath

+0

siete i benvenuti :) –

4

Il pacchetto stringi funziona molto veloce qui:

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

I benchmark sui 3 principali approcci qui:

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 Ecco il codice per il benchmark:

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

Ho perso la modifica di akrun (più o meno come il mio approccio) Partirò per il benchmark –

+0

Grazie Tyler. la libreria 'stringi' è veloce e userò quella invece di sub. – Sharath

+0

Farebbe la differenza usando 'stri_extract_first_regex' vs' stri_extract' e specificando la regex all'interno. – akrun