【问题标题】:How do read file by filtering rows based on a condition in R如何通过基于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

【问题讨论】:

    标签: r read.csv


    【解决方案1】:

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

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

    Shell 命令:

    fread 为方便起见接受 shell 命令。输入命令运行并将其输出写入 tmpdir 中的文件(默认为 link{tempdir}()),“正常”应用 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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多