【问题标题】:How do I merge two large data.frames using ff package in R?如何在 R 中使用 ff 包合并两个大型 data.frames?
【发布时间】:2013-07-08 18:57:11
【问题描述】:

我有两个非常大的 .csv 文件,我们称它们为 CSV.1 和 CSV.2(CSV.1 大约 1.4 GB,CSV.2 大约 790 MB),我想加入它们使用公共字段“Id”上的 FULL OUTER JOIN。 CSV 文件的字段有多种类型,有些完全是数字,有些是字符串。此外,CSV.1 大约有 190 列和 160 万条记录,CSV.2 大约有 40 列和 57 万条记录。

最初,我编写并执行了以下代码:

first_csv <- read.csv("CSV.1")
second_csv <- read.csv("CSV.2")
joined_csv <- join(CSV.1, CSV.2, by="Id", type="full")

但是,这返回了典型的“您的 RAM 已完全征税”错误。所以我尝试了以下方法:

# Install and invoke the ff package
install.packages("ff")
library(ff)
library(plyr)

# Read in the data
first_csv <- read.csv("CSV.1")
second_csv <- read.csv("CSV.2")

# Convert dataframes to ffdf's, while freeing up memory
first_csv_ff <- as.ffdf(first_csv)
rm(first_csv)
gc()
second_csv_ff <- as.ffdf(second_csv)
rm(second_csv)
gc()

# Attempt to join the two ffdf's by "Id"
joined_csv <- join(first_csv_ff, second_csv_ff, by="Id", type="full")

R 发出以下错误:

Error in as.hi.integer(x, maxindex = maxindex, dim = dim, vw = vw, pack = pack) : 
NAs in as.hi.integer

我也试过了,没有 as.ffdf 的“

非常感谢您的帮助!

【问题讨论】:

    标签: r join large-data


    【解决方案1】:

    您可以使用mergeff 包,仅供参考:

    FULL Outer join ~ merge(x = df1, y = df2, ...., all = TRUE)
    

    使用您的数据,这应该可以工作:

    merge(first_csv_ff, second_csv_ff, by="Id", all=TRUE)
    

    【讨论】:

    • 我很欣赏这个答案,这绝对是个好消息,但由于某种原因(即使在转换为 ff 之后)我得到:错误:无法分配大小为 555.1 Mb 的向量也许我应该单独问这个现在的问题,我有你的答案,但不应该处理内存问题吗?
    【解决方案2】:

    ffbase包提供ff包的基本统计功能。

    install.packages(ffbase)
    require(ffbase)
    #now perform the merge
    merge(ffdf1,ffdf2,by="key")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2011-01-22
      相关资源
      最近更新 更多