【发布时间】:2019-03-21 05:31:06
【问题描述】:
我正在使用read.csv.sql 有条件地读取数据(我的数据集非常大,所以这是我选择过滤它并缩小它的解决方案 之前 读取数据)。我通过读取完整数据然后过滤它遇到了内存问题,这就是为什么我使用条件读取以便读取子集而不是完整数据集很重要的原因。
这是一个小数据集,因此可以重现我的问题:
write.csv(iris, "iris.csv", row.names = F)
我发现使用read.csv.sql 时您必须使用的符号非常尴尬,以下是我尝试在文件中读取的第一种方法,它可以工作,但很混乱:
library(sqldf)
csvFile <- "iris.csv"
spec <- 'setosa'
sql <- paste0("select * from file where Species = '\"", spec,"\"'")
d1 <- read.csv.sql(file = csvFile, sql = sql)
然后我发现了另一种以稍微干净的方式编写相同符号的方法是:
sql <- paste0("select * from file where Species = '", spec,"'")
d2 <- read.csv.sql(file = csvFile, sql = sql,
filter = list('gawk -f prog', prog = '{ gsub(/"/, ""); print }'))
接下来,我想阅读从同一列中选择多个值的情况,所以我尝试了这个并且它有效:
d3 <- read.csv.sql(file = csvFile,
sql = "select * from file where Species in
('\"setosa\"', '\"versicolor\"') ")
但是,我想避免像这样对值进行硬编码,所以我尝试了:
spec2 <- c('setosa', 'versicolor')
sql2 <- paste0("select * from file where Species in '", spec2,"'")
d4 <- read.csv.sql(file = csvFile, sql = sql2,
filter = list('gawk -f prog', prog = '{ gsub(/"/, ""); print }'))
但这不起作用(它似乎只从向量中读取第一个值并尝试将其作为表格进行匹配)。我确定这又是另一个符号问题,希望帮助清理这段代码。
另外,如果您对使用read.csv.sql 和处理符号问题有任何提示/技巧,我很想听听!
【问题讨论】:
-
为什么需要使用
read.csv.sql?您可能会查看library(sqldf),它可以让您编写更自然的查询,例如sqldf("Select * from iris where Species = 'versicolor'") -
或者你可以考虑使用
dplyr,它的功能类似于SQL,但专为R设计,例如library(dplyr); iris %>% filter(Species %in% spec2) -
由于内存问题,我需要在读取文件之前过滤文件,我无法读取完整文件然后过滤。否则我会很乐意使用
dplyr。