【问题标题】:Subset large .csv file at reading in R在 R 中读取大型 .csv 文件的子集
【发布时间】:2016-02-04 22:50:05
【问题描述】:

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

问题出现在读取(内存分配错误)。由于大读取崩溃,所以我想要一种方法来对文件进行子集 beforewhile 读取它,以便它只获取一个城市的行(剑桥)。

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.

【问题讨论】:

  • 尝试在 data.table 包中使用 fread,它往往比其他方法使用更少的内存。 sqldf 包中的 read.csv.sql 也将文件读入一个 sqlite 数据库(它为您创建),而无需通过 R 进行操作,因此 R 的限制不适用,然后仅将您指定的部分拉入 R。只要你拉入 R 的最终结果足够小,它就可以工作。
  • 我今天将尝试 fread 并让人们知道结果。谢谢!

标签: r csv subset


【解决方案1】:

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

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' " )

【讨论】:

    【解决方案2】:

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

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

    我正在以这种方式处理大小超过 20 GB 的数据集。

    【讨论】:

    • 认为这有效,唯一的问题是:你如何转换 .csv -> Excel?由于 Excel 也无法打开文件!谢谢
    • 使用任何转换器zamzar.com/convert/csv-to-xls。有很多可用的。或者您可以直接将csv文件导出到toad for mysql。
    • 我已经为mysql下载了toad,当然我的sql也是如此。我开始探索它。仍然有点惊讶,在阅读之前/期间没有过滤内容的方法,而无需使用大型武器!无论如何谢谢
    • user3310782,您是否看过上面链接中的read.csv.sql 并由 Gabor(包作者)提到 - 它只允许将子集数据读入 R
    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多