簡體   English   中英

如何拆分數據框然后應用inner_join

[英]How do I split a data frame then apply inner_join

我有三個數據框,每個數據框大約有 64,000 行和相同數量的 794 列。 我需要通過一個公共列對所有 3 個數據幀進行 inner_join。 由於此錯誤“無法分配大小為 163 Mb 的向量”,因此我知道我需要按行拆分數據幀。 為了在執行inner_join時不會耗盡內存,要拆分的最佳段數是多少? 如果我必須將它們分成 10 個段,我如何遍歷這些段以對所有 3 個數據幀執行 inner_join,然后將最終的 rbind 合並為一個數據集?

謝謝你。

從技術上講,要分割的最佳段數將取決於您的數據大小和計算機的硬件規格,即我們無法為您提供明確的答案。 盡管如此,由於您的計算機在 163Mb 分配方面存在問題,您可以嘗試將這些段拆分得更小。 甚至可能一次只在 R 中加載一些段。這個“R 中的大數據”網頁可能會為您提供更多見解。

但是,將數據幀拆分為單獨的段,然后通過循環將所有這些段進行內部連接的計划可能是一個冗長且低效的過程。 您將嘗試將數據幀 1 中的每個段與數據幀 2 和數據幀 3 中的每個段進行匹配。計算機性能會像這樣變慢,並且計算機可能會再次耗盡內存。

您將需要一種更足智多謀的方法。 嘗試這個:

假設這是您的數據框(它們很小,但可以想象它們是大數據框):

set.seed(321)
df1 <- data.frame(id = sample(100, 50), random1 = rnorm(50), random2 = rnorm(50))
df2 <- data.frame(id = sample(100, 50), random3 = rnorm(50), random4 = rnorm(50))
df3 <- data.frame(id = sample(100, 50), random5 = rnorm(50), random6 = rnorm(50))

步驟 1. 刪除不需要的所有內容以減小尺寸
由於您計划使用inner_join,這告訴我您可能有一些最終將要刪除的行。 處理大數據的第一步是減少不需要的東西。

library(dplyr)

## so let's say my goal is to inner_join(by = "id")
common_id <- intersect(df1$id, df2$id) %>% intersect(df3$id)
common_id
# [1]  93  43  27  95   4  54  79  73 100  29  89  10

# keep only rows with common_id in each data frame
df1_clean <- filter(df1, id %in% common_id)
df2_clean <- filter(df2, id %in% common_id)
df3_clean <- filter(df3, id %in% common_id)

步驟 2. 加入數據框
您可以在此時加入他們。 你有幾個選擇。 2a. 使用inner_join() 但是,如果您仍然有大數據幀, inner_join()可能仍然是計算密集型的。 2b. 我認為不那么密集的方法是cbind()三個數據幀(如果我弄錯了,請告訴我),但您應該確保 common_id 在每個數據幀中以相同的順序排列。

# 2a. inner_join() approach
df_final <- inner_join(df1_clean, df2_clean, by = "id") %>% inner_join(df3_clean, by = "id")

# 2b. cbind() approach
library(magrittr)
df1_clean %<>% arrange(id)
df2_clean %<>% arrange(id) %>% dplyr::select(-id)
df3_clean %<>% arrange(id) %>% dplyr::select(-id)

df_final <- cbind(df1_clean, df2_clean) %>% cbind(df3_clean)

2c。 如果 2a。 和 2b。 仍然失敗,因為您的數據幀仍然太大,那么您可以嘗試您的分段方法: split()每個“清理過的”數據幀拆分為等效的行段,使用inner_join() (或cbind() )將它們跨數據幀連接起來,以及然后rbind() 在“網格”視圖中的工作區環境中檢查數據框和段的數據大小 (Mb)(假設您使用的是 RStudio)。 如果它們仍然很大,則將它們分解得更小。

額外的
如果您的 R 在處理大型數據幀時仍然存在問題,我建議您考慮嘗試其他編程語言(或借用更大的計算機)來創建最終數據幀。 R 在處理大數據時速度很慢或可能無法工作。 例如,我發現 bash/Unix/Terminal 在處理大數據時不太可能崩潰。 如果您只是重新組織/合並數據文件,那么在 bash 中執行它可能會很簡單,甚至更快,因為您不必將所有內容都加載到 RAM 中(請參閱此討論)。 我會在 Unix/Terminal(如果可行)中創建我需要的數據文件,然后運行 ​​R 來執行分析或生成繪圖。

暫無
暫無

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

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