我有一个由400'000行和大约50列组成的数据帧。由于这个数据框架太大,因此计算起来太费力了。 我想将这个数据帧拆分成较小的数据帧,之后我将运行我想要运行的函数,然后在最后重新组装数据帧。
我不想使用分组变量来分割这个数据帧。我只想按行数拆分它。例如,我想将这个400'000行的表分成400个1'000行的数据帧。 我怎么能这样做?
答案 0 :(得分:30)
制作自己的分组变量。
d <- split(my_data_frame,rep(1:400,each=1000))
您还应该考虑ddply
包中的plyr
函数或group_by()
中的dplyr
函数。
编辑以简洁起见。
如果你不知道数据框中有多少行,或者数据框可能是你所需的块大小的不等长,你可以这样做
chunk <- 1000
n <- nrow(my_data_frame)
r <- rep(1:ceiling(n/chunk),each=chunk)[1:n]
d <- split(my_data_frame,r)
您也可以使用
r <- ggplot2::cut_width(1:n,chunk,boundary=0)
对于未来的读者,基于dplyr
和data.table
包的方法可能(更快)对数据帧进行分组操作。
答案 1 :(得分:2)
我有一个类似的问题并使用了这个:
library(tidyverse)
n = 100 #number of groups
split <- df %>% group_by(row_number() %/% n) %>% group_map(~ .x)
从左到右:
split
df
作为输入数据框row_number
除以 n
(组数)来对数据进行分组。group_map
函数传递该组。所以最后你的 split
是一个列表,在每个元素中都有一组你的数据集。
另一方面,您也可以通过替换 group_map
调用来立即写入数据,例如group_walk(~ write_csv(.x, paste0("file_", .y, ".csv")))
。
您可以在以下位置找到有关这些强大工具的更多信息: Cheat sheet of dplyr explaining group_by 以及以下内容: group_map, group_walk follow up functions