Jel*_*ina 1 regex r stringr data.table
我有一个大数据表,我想检查是否103a_foo存在.但是,大表中的文件名以不同的方式编写,因此我必须使用正则表达式.
dt = structure(list(myID = c("86577", "34005","34005",
"194000", "30252", "71067"),
filename = c("/scratch/tmpdir/12a_foo.mzXML.gz",
"/scratch/tmpdir/103b_foo.XML.gz", "/scratch/tmpdir/103a_foo.XML.gz",
"/scratch/tmpdir/103a_foo.XML.gz",
"/scratch/tmpdir/100b_foo.XML.gz", "/scratch/tmpdir/108a_foo.XML.gz")),
class = c("data.table", "data.frame"),
row.names = c(NA, -5L),
.Names = c("myID", "filename"))
Run Code Online (Sandbox Code Playgroud)
作为输出,我想要一个索引3,因为这是它第一次出现.我会使用grep('103a_foo', dt$filename)[1],但我希望搜索在第一次出现时停止,因为表很大(1000万行).
如果你设置fixed = TRUE它不需要那么长时间.对你的需求来说真的太慢吗?
x <- sample(dt$filename, 1e7, TRUE)
library(microbenchmark)
microbenchmark(grep('103a_foo', x),
grep('103a_foo',dt$filename, fixed = TRUE),
times = 5)
#Unit: milliseconds
# expr min lq mean #median uq max neval cld
# grep("103a_foo", x) 2124.8178 2125.707 2128.7849 2127.542 2128.2054 2137.6532 5 b
# grep("103a_foo", x, fixed = TRUE) 826.2298 826.597 832.7058 829.969 840.1974 840.5359 5
Run Code Online (Sandbox Code Playgroud)
据我所知,没有有效的方法来实现grep使用纯R打破矢量化循环.如果你经常需要它,可以使用Rcpp.