在R中读取时子集大.csv文件

时间:2015-11-04 12:26:40

标签: r csv subset

我有一个非常大的.csv文件(~4GB),我想阅读,然后是子集。

问题在于读取(内存分配错误)。由于大型阅读崩溃,所以我想要的是在或 读取文件之前对文件进行子集化的方法,以便它只获取一行城市(剑桥)。

f:
        id City      Value
        1  London     17
        2  Coventry   21
        3  Cambridge  14
        ......

我已经尝试过常用方法:

f <- read.csv(f, stringsAsFactors=FALSE, header=T, nrows=100)

f.colclass <- sapply(f,class)

f <- read.csv(f,sep = ",",nrows = 3000000, stringsAsFactors=FALSE, 
                  header=T,colClasses=f.colclass)

似乎适用于1-2M行,但不适用于整个文件。

我还尝试使用竖管在阅读本身进行子集化:

f<- read.table(file = f,sep = ",",colClasses=f.colclass,stringsAsFactors   = F,pipe('grep "Cambridge" f ') )

这似乎也崩溃了。

我认为包sqldf或data.table会有一些东西,但还没有成功!!

提前致谢,p。

2 个答案:

答案 0 :(得分:3)

我认为这已被提及,但以防万一并不完全清楚。 sqldf包基于csv文件在您的机器上创建临时SQLite DB,并允许您在将结果保存到data.frame之前编写SQL查询以执行数据的子集

library(sqldf)

query_string <- "select * from file where City=='Cambridge' "
f <- read.csv.sql(file = "f.csv", sql = query_string)

#or rather than saving all of the raw data in f, you may want to perform a sum

f_sum <- read.csv.sql(file = "f.csv",
 sql = "select sum(Value) from file where City=='Cambridge' " )

答案 1 :(得分:1)

此类错误的一种解决方案是

  1. 您可以先将csv文件转换为excel文件。
  2. 然后你可以使用 toad for mysql 将excel文件映射到mysql表中。这很容易。只需检查变量的数据类型。
  3. 然后使用RODBC包,您可以访问这么大的数据集。
  4. 我正在使用大小超过20 GB 的数据集。