首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中拆分字符串是最快的方法吗?

在R中拆分字符串是最快的方法吗?
EN

Stack Overflow用户
提问于 2021-09-10 03:05:51
回答 3查看 75关注 0票数 0

我有一个字符串"1500|3|10000|5",我希望有一个数值向量,如下所示:

[1] 1500 3 10000 5

strsplit比str_extract_all快得多。strsplit是最快的方法吗?

代码语言:javascript
复制
library("tidyverse")
library("microbenchmark")

x <- "1500|3|10000|5"

# mean ~ 137 microseconds
microbenchmark(
  x |> 
    str_extract_all("\\d+") |> 
    unlist(use.names = FALSE) |> 
    as.double() 
)

# mean ~ 15 microseconds
microbenchmark(
  x |> 
    strsplit(split = "\\|") |> 
    unlist(use.names = FALSE) |> 
    as.double() 
)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-10 07:18:07

stringi似乎稍微快一些,而且为了达到最大速度,应该省略管道。

代码语言:javascript
复制
library(stringr)
library(stringi)

set.seed(123)
x <- paste0(sample(100000), collapse = '|')

microbenchmark::microbenchmark(
  str_extract = x |> 
    str_extract_all("\\d+") |> 
    unlist(use.names = FALSE) |> 
    as.double() , 
  strsplit = x |> 
    strsplit(split = "\\|") |> 
    unlist(use.names = FALSE) |> 
    as.double() , 
  strsplit_fixed = x |> 
    strsplit(split = '|', fixed = TRUE) |> 
    unlist(use.names = FALSE) |> 
    as.numeric(),
  
  stringi = as.numeric(stri_split_fixed(x, '|')[[1]]),
  stringi2 = x |> 
    stri_split_fixed(pattern = '|') |> 
    unlist(use.names = FALSE) |> 
    as.numeric()
)
# Unit: milliseconds
#           expr     min       lq     mean   median       uq      max neval  cld
#    str_extract 27.5158 27.77085 28.63940 28.01650 28.32090  36.7092   100   c 
#       strsplit 50.6624 51.16750 52.11587 51.55955 51.98610  59.2446   100    d
# strsplit_fixed 18.9921 19.24650 20.95589 19.40140 19.68805 113.9647   100  b  
#        stringi 17.8246 18.13970 18.53155 18.31015 18.57825  26.4410   100 a   
#       stringi2 18.2519 18.64035 19.21868 18.78765 19.20105  27.1056   100 ab
票数 1
EN

Stack Overflow用户

发布于 2021-09-10 08:36:49

我假设这个问题是因为您有一个很大的以竖线分隔的文件,并且需要将其转换为数据框。

如果您已经将文件读入字符矢量x

代码语言:javascript
复制
x <- readLines("mydelimfile.txt")

# base R
df <- read.delim(text=x, sep="|", header=FALSE)

# with readr
df <- readr::read_delim(paste0(x, collapse="\n"), delim="|", col_names=FALSE)

但是您可以直接将文件转换为df:

代码语言:javascript
复制
df <- read.delim("mydelimfile.txt", sep="|")

df <- readr::read_delim("mydelimfile.txt", delim="|")
票数 1
EN

Stack Overflow用户

发布于 2021-09-10 05:41:18

strsplit中使用fixed = TRUE可以获得更好的结果。在一个更大的示例中,在你的帖子中,str_extract_allstrsplit代码执行得更好。

代码语言:javascript
复制
library(stringr)

set.seed(123)
x <- paste0(sample(100000), collapse = '|')

microbenchmark::microbenchmark(
str_extract = x |> 
              str_extract_all("\\d+") |> 
              unlist(use.names = FALSE) |> 
              as.double() , 

strsplit = x |> 
           strsplit(split = "\\|") |> 
           unlist(use.names = FALSE) |> 
           as.double() , 

strsplit_fixed = x |> 
                 strsplit(split = '|', fixed = TRUE) |> 
                 unlist(use.names = FALSE) |> 
                 as.numeric() 
)

#Unit: milliseconds
#           expr      min       lq     mean   median        uq       max neval cld
#    str_extract 27.00734 28.68815 30.62537 29.62420  31.59296  55.36550   100  b 
#       strsplit 87.71705 91.47075 97.39022 94.99620 101.27776 123.17484   100   c
# strsplit_fixed 17.57684 20.08943 23.03720 21.59174  23.40159  49.83912   100 a  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69126751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档