如何通过基于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
包中的fread
和cmd
选项。来自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中的条件过滤行来读取文件的主要内容,如果未能解决你的问题,请参考以下文章