あなたの質問についていくつかの有用な注意事項:まず、あなたはそれがlapply呼び出すことによって、何をしたいかないstringr
パッケージでstr_split_fixed
機能があります。それは第二に、別の方法は、リストの各第二の要素を抽出することを考えるようにstringi::stri_split_fixed
を呼び出すことによって動作し、
do.call("c", lapply(str_split(sample_string, '/'),"[[",2))
に異ならないです
library(data.table); library(stringr)
sample_string <- c('US/SPY', 'US/AOL', 'US/MTC', 'US/PHA', 'US/PZI',
'US/AOL', 'US/BRCM')
sample_string <- rep(sample_string, 1e5)
split_string <- str_split_fixed(sample_string, '/', 2)[,2]
はtstrsplit
が内部的に行っていることを正確に何をすることです。総サイドノートで
transpose(strsplit(sample_string, "/", fixed = T))[[2]]
、上記tstrsplit
を呼び出すよりもわずかに速くする必要があります。これはもちろん、おそらく長さを入力する価値はありませんが、関数が何をしているかを知るのに役立ちます。
library(data.table); library(stringr)
s4 <- function() tstrsplit(sample_string, "/", fixed = TRUE)[[2]]
s5 <- function() transpose(strsplit(sample_string, "/", fixed = T))[[2]]
identical(s4(), s5())
microbenchmark::microbenchmark(s4(), s5(), times = 20)
microbenchmark::microbenchmark(s4(), s5(), times = 20)
Unit: milliseconds
expr min lq mean median uq max neval
s4() 161.0744 193.3611 255.8136 234.9945 271.6811 434.7992 20
s5() 140.8569 176.5600 233.3570 194.1676 251.7921 420.3431 20
2つの要素とのそれぞれは、長さ2のリストに700万要素と各あなたの結果を変換する、長さ700万このリストを転置要するに、この第二の方法、に関する。このリストの2番目の要素を抽出します。
これを達成する方法はたくさんあります。例えば 'sub("。* /(。*) "、" \\ 1 "、sample_string)' OR 'sub("。*/"、" "、sample_string)'などです。正規表現を避けるdata.table :: tstrsplit(sample_string、 "/"、fixed = TRUE)[[2]] ' –
'。* /(。*)'はここでポインタとして機能しますか? –
"*バックスラッシュの前にすべてをマッチさせて(それを含む)すべてのものをキャプチャする"という意味です。 '\\ 1'は捕捉されたグループを返すように' sub'に指示します。このケースでは、それは過剰補完だと私は思うが。他の2つのオプションはおそらくより良い/よりシンプルです。いずれにしても、このタイプの質問は何度も尋ねられましたので、Rでより多くの正規表現の例を見たい場合は、実際にGoogleを試してください。このサイトは、将来の正規表現のテストhttps://regex101.com/とチュートリアルのためのこの1つはhttp://www.regular-expressions.info/tutorial.html –