【问题标题】:Using fread() to select rows and columns, the way read.csv.sql() does使用 fread() 选择行和列,read.csv.sql() 的方式
【发布时间】:2014-05-06 19:08:45
【问题描述】:

我知道fread 相对较新,但它确实提供了很大的性能改进。我想知道的是,您可以从正在阅读的文件中选择行和列吗?有点像read.csv.sql 的作用?我知道使用freadselect 选项可以选择要读取的列,但是只读取满足特定条件的行怎么样。

例如,可以使用fread 实现类似下面的内容吗?

read.csv.sql(file, sql = "select V2,V4,V7,V8,V9, V10 from file where V5=='CE' and V10 >= 500",header = FALSE, sep= '|', eol ="\n")

如果这还不可能,是否建议读取全部数据,然后使用subset等来得出最终结果?还是会破坏使用fread 的目的?

作为参考,我必须阅读大约 800 个文件,每个文件包含大约 100,000 行和 10 列。 欢迎任何意见。

谢谢。

【问题讨论】:

  • 最终,是的。只需在读取的每个文件中添加文件名作为列。然后将所有内容合并为一个大文件。
  • 文档没有提到这样的功能。此外,当行的选择必须满足某些条件时(我想这是基于 df 中的信息),您必须先读取数据.....
  • 我愿意:ans = rbindlist(lapply(files, function(x) fread(x)[, fn := x]))。然后,在ans 上进行一次子集化(假设子集条件相同)。
  • 感谢您的建议。你能解释一下你在这里做什么吗?我还不太熟悉 R :)
  • @Arun 我想通了,这是一个很好的方法。唯一的问题是,由于文件很大,我不能一口气读完它们。事实上,仅读取 10 个文件就占用了我近 1.5 GB 的可用 RAM。所以我不得不求助于一个循环来一次读取几个文件,对它们进行子集化,然后清除内存。非常感谢您的帮助。

标签: r data.table


【解决方案1】:

目前还不能像 read.csv.sql() 那样选择带有 fread() 的行。但最好还是读取整个数据(内存允许),然后根据您的标准对其进行子集化。对于 200 mb 的文件,fread()+ subset() 的性能是 read.csv.sql() 的 4 倍左右。

所以,根据@Arun 的建议,

ans = rbindlist(lapply(files, function(x) fread(x)[, fn := x]))
subset(ans, 'your criteria')

比原始问题中的方法更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2019-03-21
    • 2016-01-03
    • 2014-09-30
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多