簡體   English   中英

合並更大數據的有效替代方案。框架R

[英]Efficient alternatives to merge for larger data.frames R

我正在尋找一種有效的(計算機資源方面和學習/實現方式)方法來合並兩個更大的(大小> 100萬/ 300 KB RData文件)數據幀。

基礎R中的“merge”和plyr中的“join”似乎耗盡了我的所有內存,有效地崩潰了我的系統。


加載測試數據框

並嘗試

test.merged<-merge(test, test)

要么

test.merged<-join(test, test, type="all")  
    -

以下帖子提供了合並和備選方案的列表:
如何加入(合並)數據框(內部,外部,左側,右側)?

以下允許對象大小檢查:
https://heuristically.wordpress.com/2010/01/04/r-memory-usage-statistics-variable/

匿名制作的數據

以下是data.table與data.frame方法的一些時序。
使用data.table非常快。 關於內存,我可以非正式地報告這兩種方法在RAM使用方面非常相似(在20%以內)。

library(data.table)

set.seed(1234)
n = 1e6

data_frame_1 = data.frame(id=paste("id_", 1:n, sep=""),
                          factor1=sample(c("A", "B", "C"), n, replace=TRUE))
data_frame_2 = data.frame(id=sample(data_frame_1$id),
                          value1=rnorm(n))

data_table_1 = data.table(data_frame_1, key="id")
data_table_2 = data.table(data_frame_2, key="id")

system.time(df.merged <- merge(data_frame_1, data_frame_2))
#   user  system elapsed 
# 17.983   0.189  18.063 


system.time(dt.merged <- merge(data_table_1, data_table_2))
#   user  system elapsed 
#  0.729   0.099   0.821 

這是必須的data.table示例:

library(data.table)

## Fix up your example data.frame so that the columns aren't all factors
## (not necessary, but shows that data.table can now use numeric columns as keys)
cols <- c(1:5, 7:10)
test[cols] <- lapply(cols, FUN=function(X) as.numeric(as.character(test[[X]])))
test[11] <- as.logical(test[[11]])

## Create two data.tables with which to demonstrate a data.table merge
dt <- data.table(test, key=names(test))
dt2 <- copy(dt)
## Add to each one a unique non-keyed column
dt$X <- seq_len(nrow(dt))
dt2$Y <- rev(seq_len(nrow(dt)))

## Merge them based on the keyed columns (in both cases, all but the last) to ...
## (1) create a new data.table
dt3 <- dt[dt2]
## (2) or (poss. minimizing memory usage), just add column Y from dt2 to dt
dt[dt2,Y:=Y]

你必須在R中合並嗎? 如果沒有,使用簡單的文件串聯合並底層數據文件,然后將它們加載到R.(我意識到這可能不適用於您的情況 - 但如果確實如此,它可以為您節省很多麻煩。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM