按行数拆分数据框

时间:2011-08-14 22:50:30

标签: r split dataframe

我有一个由400'000行和大约50列组成的数据帧。由于这个数据框架太大,因此计算起来太费力了。 我想将这个数据帧拆分成较小的数据帧,之后我将运行我想要运行的函数,然后在最后重新组装数据帧。

我不想使用分组变量来分割这个数据帧。我只想按行数拆分它。例如,我想将这个400'000行的表分成400个1'000行的数据帧。 我怎么能这样做?

2 个答案:

答案 0 :(得分:30)

制作自己的分组变量。

d <- split(my_data_frame,rep(1:400,each=1000))

您还应该考虑ddply包中的plyr函数或group_by()中的dplyr函数。

在Hadley的评论之后,

编辑以简洁起见。

如果你不知道数据框中有多少行,或者数据框可能是你所需的块大小的不等长,你可以这样做

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)

对于未来的读者,基于dplyrdata.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