dplyr是唯一能够处理我的843k data.frame并以快速方式查询它的软件包。 我可以使用一些数学和相同的标准来过滤,但是我需要实现搜索概念。
我需要像这样的sqldf查询
library(sqldf)
head(iris)
sqldf("select * from iris where lower(Species) like '%nica%'")
在dplyr帮助中,我无法找到如何做到这一点。类似的东西:
filter(iris,Species like '%something%')
开始和结束%非常重要。另请注意,数据帧有800 + k行,因此传统的R函数可能运行缓慢。它必须是基于dplyr的解决方案。
答案 0 :(得分:6)
这个怎么样 -
library(dplyr)
data(iris)
filter(iris, grepl("nica",Species))
编辑:另一个选项 - %like%
data.table()
函数
library(dplyr)
data(iris)
##
Iris <- iris[
rep(seq_len(nrow(iris)),each=5000),
]
dim(Iris)
[1] 750000 5
##
library(microbenchmark)
library(data.table)
##
Dt <- data.table(Iris)
setkeyv(Dt,cols="Species")
##
foo <- function(){
subI <- filter(Iris, grepl("nica",Species))
}
##
foo2 <- function(){
subI <- Dt[Species %like% "nica"]
}
##
foo3 <- function(){
subI <- filter(Iris, Species %like% "nica")
}
Res <- microbenchmark(
foo(),foo2(),foo3(),
times=100L)
##
> Res
Unit: milliseconds
expr min lq median uq max neval
foo() 114.31080 122.12303 131.15523 136.33254 214.0405 100
foo2() 23.00508 30.33685 39.77843 41.49121 129.9125 100
foo3() 18.84933 22.47958 29.39228 35.96649 114.4389 100
答案 1 :(得分:2)
完整代码将是(包括小写)
require(data.table)
iris %>% filter(tolower(Species) %like% 'nica')