R:在第一个分隔符出现时快速字符串拆分

时间:2014-10-08 18:08:51

标签: regex r string split

我有一个大约有4千万行的文件,我需要根据第一个逗号分隔符进行拆分。

以下使用stringr函数str_split_fixed效果很好,但效果很慢。

library(data.table)
library(stringr)

df1 <- data.frame(id = 1:1000, letter1 = rep(letters[sample(1:25,1000, replace = T)], 40))
df1$combCol1 <- paste(df1$id, ',',df1$letter1, sep = '')
df1$combCol2 <- paste(df1$combCol1, ',', df1$combCol1, sep = '')

st1 <- str_split_fixed(df1$combCol2, ',', 2)

有什么建议可以更快地执行此操作吗?

1 个答案:

答案 0 :(得分:8)

更新

&{34; stringi&#34;的更新版本中的stri_split_fixed功能有simplify参数可以设置为TRUE以返回矩阵。因此,更新的解决方案将是:

stri_split_fixed(df1$combCol2, ",", 2, simplify = TRUE)

原始答案(更新基准)

如果您对&#34; stringr&#34;感到满意语法并不想偏离它太远,但你也希望从速度提升中受益,尝试&#34; stringi&#34;改为包装:

library(stringr)
library(stringi)
system.time(temp1 <- str_split_fixed(df1$combCol2, ',', 2))
#    user  system elapsed 
#    3.25    0.00    3.25 
system.time(temp2a <- do.call(rbind, stri_split_fixed(df1$combCol2, ",", 2)))
#    user  system elapsed 
#    0.04    0.00    0.05 
system.time(temp2b <- stri_split_fixed(df1$combCol2, ",", 2, simplify = TRUE))
#    user  system elapsed 
#    0.01    0.00    0.01

大多数&#34; stringr&#34;函数有&#34; stringi&#34;相似之处,但从这个例子中可以看出,&#34; stringi&#34;输出需要一个额外的步骤来绑定数据以创建输出作为矩阵而不是列表。


以下是评论中与@ RichardScriven的建议的比较:

fun1a <- function() do.call(rbind, stri_split_fixed(df1$combCol2, ",", 2))
fun1b <- function() stri_split_fixed(df1$combCol2, ",", 2, simplify = TRUE)
fun2 <- function() {
  do.call(rbind, regmatches(df1$combCol2, regexpr(",", df1$combCol2), 
                            invert = TRUE))
} 

library(microbenchmark)
microbenchmark(fun1a(), fun1b(), fun2(), times = 10)
# Unit: milliseconds
#     expr       min        lq      mean    median        uq       max neval
#  fun1a()  42.72647  46.35848  59.56948  51.94796  69.29920  98.46330    10
#  fun1b()  17.55183  18.59337  20.09049  18.84907  22.09419  26.85343    10
#   fun2() 370.82055 404.23115 434.62582 439.54923 476.02889 480.97912    10