如何拆分数据框然后应用 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 中加载一些片段。 This "Big data in R" webpage 可能会为您提供更多见解。

但是,将您的数据帧拆分为单独的段然后 inner_join 所有这些都通过一个循环的计划可能是一个冗长且低效的过程。您将尝试将数据帧 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 在处理大数据时不太可能崩溃。如果您只是 reorganizing/merging 个数据文件,那么在 bash 中执行起来会很简单,甚至更快,因为您不必将所有内容都加载到 RAM 中(请参阅 )。我会在 Unix/Terminal(如果可行)中创建我需要的数据文件,然后 运行 R 来执行分析或生成图。