在R中提取部分字符串(直到第一个分号)

时间:2015-04-20 15:36:32

标签: r string gsub

我有一个包含由分号分隔的3个字符串的值的列。我需要提取字符串的第一部分。

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

我想要的是:获取字符串的第一部分(直到第一个分号)。

输出:SNSR_RMIN_PSX150Y_CSH

我尝试了gsub但却无法理解。请告诉我们如何在R中有效地做到这一点。

4 个答案:

答案 0 :(得分:8)

您可以尝试sub

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

它将匹配模式,即;首次出现在字符串的末尾,并替换为''

或使用

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

答案 1 :(得分:6)

stringi 包在这里工作得非常快:

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)

答案 2 :(得分:3)

您也可以使用strsplit

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

答案 3 :(得分:1)

当性能很重要时,可以结合使用substr base 中的regexpr

substr(Type, 1, regexpr(";", Type, fixed=TRUE)-1)
#[1] "SNSR_RMIN_PSX150Y_CSH"

时间:(重复使用@ tyler-rinker中的部分)

library(stringi)
SAPPLY <- function() sapply(strsplit(Type, ";"), "[[", 1)
SUB <- function() sub(';.*$','', Type)
SUB2 <- function() sub(';.*','', Type)
SUB3 <- function() sub('([^;]*).*','\\1', Type)
STRINGI <- function() stri_extract_first_regex(Type, "^[^;]+")
STRINGI2 <- function() stri_extract_first_regex(Type, "[^;]*")
SUBSTRREG <- function() substr(Type, 1, regexpr(";", Type)-1)
SUBSTRREG2 <- function() substr(Type, 1, regexpr(";", Type, fixed=TRUE)-1)
SUBSTRREG3 <- function() substr(Type, 1, regexpr(";", Type, fixed=TRUE, useBytes = TRUE)-1)

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

library(microbenchmark)
microbenchmark(SAPPLY(), SUB(), SUB2(), SUB3(), STRINGI()
 , STRINGI2(), SUBSTRREG(), SUBSTRREG2(), SUBSTRREG3())
#Unit: milliseconds
#         expr       min        lq      mean    median        uq       max neval
#     SAPPLY() 382.23750 395.92841 412.82508 410.05236 427.58816 460.28508   100
#        SUB() 111.92120 114.28939 116.41950 115.57371 118.15573 123.92400   100
#       SUB2()  94.27831  96.50462  98.14741  97.38199  99.15260 119.51090   100
#       SUB3() 167.77139 172.51271 175.07144 173.83121 176.27710 190.97815   100
#    STRINGI()  38.27645  39.33428  39.94134  39.71842  40.50182  42.55838   100
#   STRINGI2()  38.16736  39.19250  40.14904  39.63929  40.37686  56.03174   100
#  SUBSTRREG()  45.04828  46.39867  47.13018  46.85465  47.71985  51.07955   100
# SUBSTRREG2()  10.67439  11.02963  11.29290  11.12222  11.43964  13.64643   100
# SUBSTRREG3()  10.74220  10.95139  11.39466  11.06632  11.46908  27.72654   100