如何通过基于R中的条件过滤行来读取文件

Posted

技术标签:

【中文标题】如何通过基于R中的条件过滤行来读取文件【英文标题】:How do read file by filtering rows based on a condition in R 【发布时间】:2020-09-11 09:22:47 【问题描述】:

我正在使用 R 访问 csv。但是我不希望整个数据集都在内存中,因为数据集太大了。但我需要根据一列的类别读取行。

我只想读取 col2 = 'A' 的行

示例: col1 col2 col 3 1 A 1000 2 B 2000 3 A 1000 4 A 2000 5 A 1000 6 B 2000

【问题讨论】:

【参考方案1】:

您可以尝试使用data.table 包中的freadcmd 选项。来自documentation:

预处理文件的shell命令;例如fread(cmd=paste("grep",word,"filename")。查看详情。

Shell 命令:

fread 为方便起见接受 shell 命令。输入命令运行并将其输出写入 tmpdir 中的文件(默认为 linktempdir()),“正常”应用 fread。细节取决于平台——系统用于 UNIX 环境,否则使用 shell;见系统。

所以如果你运行类似

library(data.table)
t <- fread(......., cmd=paste("grep","' A '","filename"), .....)

然后它过滤包含A(由空格包围的A)的行,然后将fread应用于结果。

【讨论】:

我认为如果数据真的很大,也许vroom会很有用 @akrun 第一次听说vroom 包,看起来很有趣。谢谢【参考方案2】:

我们可以使用sqldf

library(sqldf)
df1 <- read.csv.sql("file.csv", "select *, from file where col2 = 'A'", sep=",")

【讨论】:

它(SQL过滤器)是否在读取整个文件后运行? OP 说他不希望整个文件都在内存中。 @SeverinPappadeux 它将数据导入临时 SQLite 数据库,然后将其读入 R。 啊,我明白了。我建议将 fread 与 shell 和 grep 一起使用,其中过滤器恰好在读取整个文件之前运行【参考方案3】:

其中一个应该可以解决问题:

fread(file=file_name, select=col_names)[specific_col_name %in% ID_name] 

fread(file=file_name, select=col_names)[grep(pattern, specific_col_name, ignore.case = TRUE)] 

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于如何通过基于R中的条件过滤行来读取文件的主要内容,如果未能解决你的问题,请参考以下文章

R如何根据条件读取文本文件

如何通过使用 R 将每个文件的数据添加为附加行来将不同的 .csv 文件组合成一个完整的文件?

如何才能拿R读取Excel文件

Apache Beam 处理文件

如何从R中的大型固定宽度文件中读取特定列

如何在 R 中反应性地做多个情节?