簡體   English   中英

有效地加入2個以上的data.tables

[英]Efficiently joining more than 2 data.tables

我想知道是否有一種內存有效的方式來加入n data.tables(或數據幀)。 例如,如果我有以下4個data.tables:

df1 = data.table(group = c(1L,2L,3L),value = rnorm(3),key = "group")
df2 = data.table(group = c(2L,1L,3L),value2 = rnorm(3),key = "group")
df3 = data.table(group = c(3L,2L,1L),value3 = rnorm(3),key = "group")
df4 = data.table(group = c(1L,3L,2L),value4 = rnorm(3),key = "group")

我可以像這樣合並它們:

merge(df1,merge(df2,merge(df3,df4)))

但這似乎不是一個最佳解決方案。 我可能有許多需要合並的data.tables。 有沒有辦法概括上述內容而不將每個連續的合並復制到內存? 在data.table之外是否有一種已經被接受的方法可以做到這一點?

根據您的數據,以下是您可能擁有的其他一些選項。 除了顯而易見的大量合並之外的其他選擇,我的意思是:在一個循環中,使用Reduce或者使用hadley的join_all / merge_all / wrap_em_all_up

這些都是我使用的方法,並且發現在我自己的工作中更快,但我不打算嘗試一般的基准測試案例。 首先,一些設置:

DFlist = list(df1,df2,df3,df4)
bycols = key(DFlist[[1]])

我假設這些表都是由bycols鍵入的。

堆。 如果每個表中的新cols以某種方式彼此相關並且出現在每個表中的相同位置,那么考慮只是堆疊數據:

DFlong = rbindlist(DFlist, use.names = FALSE, idcol = TRUE)

如果由於某種原因你真的想要寬格式的數據,你可以dcast

dcast(DFlong, 
  formula = sprintf("%s ~ .id", paste(bycols, collapse = "+")), 
  value.var = setdiff(names(DFlong), c(bycols, ".id"))
)

但是,Data.table和R最適合使用長格式數據。

復制cols。 如果您知道bycols在所有表中采用所有相同的值,那么只需復制:

DF = DFlist[[1]][, bycols, with=FALSE]
for (k in seq_along(DFlist)){
  newcols = setdiff(names(DFlist[[k]]), bycols)
  DF[, (newcols) := DFlist[[k]][, newcols, with=FALSE]]
}

合並分配。 如果某些表中可能缺少某些級別的bycols ,則創建包含所有組合的主表並執行一系列merge-assigns:

DF = unique(rbindlist(lapply(DFlist, `[`, j = bycols, with = FALSE)))
for (k in seq_along(DFlist)){
  newcols = setdiff(names(DFlist[[k]]), bycols)
  DF[DFlist[[k]], (newcols) := mget(newcols)]
}

在dplyr中:

由於您的試驗都具有相同的名稱(並且您已經清除了NA),您可以綁定行並進行匯總。

library(dplyr)

DF <- bind_rows(df1,df2,df3,df4) %>%
    group_by(group) %>%
    summarise_each(funs(na.omit))

除此之外,還有一個簡單的局部最小解決方案:盡管至少用這種方言編碼可以節省你自己洋蔥的幾層。

DF <- 
    df1 %>% 
    full_join(df2) %>% 
    full_join(df3) %>% 
    full_join(df4) 

由於dplyr在C ++中運行而不是S,它應該更快。 遺憾的是,我無法說出內存使用效率。

(對於類似的情況,請參閱: R:用另一個數據幀的dplyr sol'n 更新數據幀

暫無
暫無

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

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