2015-04-20 5 views
5

У меня есть столбец, содержащий значения 3 строки, разделенные точками с запятой. Мне нужно просто извлечь первую часть строки.Извлечь часть строки (до первой точки с запятой) в R

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

Что я хочу: Получите первую часть строки (до первой точки с запятой).

Выход: SNSR_RMIN_PSX150Y_CSH

Я попытался GSUB, но не в состоянии понять. Пожалуйста, дайте мне знать, как мы можем сделать это эффективно в R.

ответ

6

Вы можете попробовать sub

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

Это будет соответствовать шаблону, т.е. первого совпадения ; до конца строки и заменить ''

Или используйте

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

Спасибо. Работает даже с большими наборами данных. – Sharath

+0

@Sharath Нет проблем. Я думаю, что 'stringi' должен быть быстрее. Обновленный с помощью одного из вариантов, пожалуйста, проверьте, что это быстро – akrun

+0

'stringi' работает очень быстро. Спасибо, что указали это. – Sharath

3

вы также можете использовать strsplit

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

Спасибо. Работает хорошо. – Sharath

+0

приветствую :) –

4

Пакет стринги работает очень быстро здесь:

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

Я протестированные на 3-х основных подходов здесь:

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 Вот код контрольные показатели:

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

Я пропустил редактирование akrun (примерно то же, что и мой подход). Я отправлюсь для теста –

+0

Спасибо Tyler. библиотека 'stringi' работает быстро, и я собираюсь использовать это вместо sub. – Sharath

+0

Может ли это повлиять на использование 'stri_extract_first_regex' vs' stri_extract' и указав регулярное выражение внутри. – akrun

Смежные вопросы