【问题标题】:Read a large data set via fread in R but only need a subset (one variable that equals some values)通过 R 中的 fread 读取大型数据集,但只需要一个子集(一个等于某些值的变量)
【发布时间】:2020-03-28 23:01:07
【问题描述】:

我正在尝试在 R 中读取一个大型数据集 (>30G),但我的笔记本电脑只有 16G 的 RAM。但我只需要这个数据集的一个子集。具体来说,我需要其 ID(我的数据集中有一个表示该 ID 的变量)等于某些值(这些值来自另一个数据集)的所有观察值。如果我有足够的RAM,自然会先读取两个数据文件,然后通过公共ID进行合并。

由于内存不足,是否可以使用 shell 命令以某种方式预处理数据文件,以便我可以将其用作 cmdfread 的参数。或者有人有替代解决方案吗?提前致谢!

【问题讨论】:

  • 你能分享你使用的'fread'命令,以及数据文件的前几行。它将更容易推荐适合预处理数据集的工具(用于主数据集和具有 ID 的数据集)
  • 你有像join这样的GNU Text Utilities吗?
  • 您使用的是什么操作系统? cmd/终端命令将相应地有所不同。或者,您可以尝试将数据集加载到类似 sql 的服务器,然后使用 DBI 查询访问相关行。
  • 除了@Rohit 的评论,还有一个名为vroom 的包可能(也)有帮助。
  • @dash-o 主数据集如下所示: main

标签: r shell data.table large-data data-cleaning


【解决方案1】:

您可以使用 GNU Text Utilities joinsort 中所述的 R Data Import/Export 预先拥有您的数据。

#Create files to use
t1 <- tempfile() #File 1 with id and data
write.table(data.frame(id=1:5, val=5:1), t1, row.names=FALSE, col.names=FALSE)
t2 <- tempfile() #File 2 with id's which should be used from File 1
write.table(c(1,3,4), t2, row.names=FALSE, col.names=FALSE)

t3 <- tempfile()
t4 <- tempfile()
read.table(pipe(paste("sort -k 1b,1", t1, ">", t3, "
sort -u -k 1b,1", t2, ">", t4, "
join", t3, t4)))
#  V1 V2
#1  1  5
#2  3  3
#3  4  2

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2023-03-10
    • 2020-07-12
    • 1970-01-01
    • 2016-03-29
    相关资源
    最近更新 更多