使用fread()选择行和列,类似于read.csv.sql()的方法

6
我知道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 个文件,每个文件包含约 10 列、100,000 行的数据。
欢迎任何意见。
谢谢。

2
我会这样做:ans = rbindlist(lapply(files, function(x) fread(x)[, fn := x]))。然后,在 ans 上进行一次子集操作(假设子集条件相同)。 - Arun
谢谢您的建议。您能否解释一下您在这里做什么?我还不太熟悉R :) - Shivam
我和shivam有同样的问题。请问有人知道在不久的将来是否可以使用fread来实现吗? - rdatasculptor
@user1983395 对我来说,当我遵循Arun的方法并使用我评论的解决办法时,它起作用了。您可能想尝试一下。 - Shivam
@Shivam,你能回答一下自己的问题并将其标记为已解决吗?这样可以将其从未解决问题列表中移除。 - jangorecki
显示剩余3条评论
1个回答

5
目前使用 fread() 无法像使用 read.csv.sql() 那样选择行。但是,如果内存允许,最好先读取整个数据,然后根据您的条件对其进行子集处理。对于一个 200 mb 的文件,fread() + subset() 的性能比 read.csv.sql() 快大约四倍。

因此,采用 @Arun 的建议:

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

比原问题中的方法更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接