我有三个数据帧,每个数据帧有大约64000行和相同数量的794列。我需要通过一个公共列对所有3个数据帧执行inner_join。由于这个错误";不能分配大小为163Mb"的矢量;,因此,我理解我需要按行划分数据帧。在执行inner_join时,为了避免内存耗尽,要拆分的最佳段数是多少?如果我必须将它们分割成10个片段,那么我如何循环这些片段,对所有3个数据帧进行inner_join,然后将最后一个rbind分割成一个数据集?
谢谢。
从技术上讲,要拆分的最佳段数将取决于您的数据大小和计算机的硬件规格,也就是说,我们无法为您提供这个问题的明确答案。尽管如此,由于您的计算机存在163Mb分配问题,您可以尝试将分段拆分得更小。甚至可能一次只在R中加载一些段。这个";R中的大数据;网页可能会为您提供更多见解。
然而,这种将数据帧拆分为单独的段,然后通过循环对所有数据帧进行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()
each";"清洁";将数据帧划分为等效的行段,用inner_join()
(或cbind()
(和rbind()
在数据帧之间连接它们。在您的工作空间的"环境"中检查您的数据帧和段的数据大小(Mb(;网格";视图(假设您使用的是RStudio(。如果它们仍然很大,那么就把它们分解得更小。
额外
如果您的R在处理大型数据帧时仍然存在问题,我建议您考虑尝试其他编程语言(或借用更大的计算机(来创建最终的数据帧。在处理大数据时,R速度较慢或可能不起作用。例如,我发现bash/Unix/Terminal在处理大数据时不太可能崩溃。如果您只是重新组织/合并数据文件,那么在bash中做起来可能很简单,甚至更快,因为您不必将所有内容都加载到RAM中(请参阅本讨论(。我会在Unix/Terminal中创建我需要的数据文件(如果可行的话(,然后运行R来执行分析或生成绘图。