按行数拆分数据框

Pas*_*cal 24 split r dataframe

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

我没有用于分割此数据帧的分组变量.我只想按行数拆分它.例如,我想将这个400'000行的表分成400个1'000行的数据帧.我怎么能这样做?

Ben*_*ker 32

制作自己的分组变量.

d <- split(my_data_frame,rep(1:400,each=1000))
Run Code Online (Sandbox Code Playgroud)

你也应该考虑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)
Run Code Online (Sandbox Code Playgroud)

你也可以用

r <- ggplot2::cut_width(1:n,chunk,boundary=0)
Run Code Online (Sandbox Code Playgroud)

对于未来的读者来说,基于dplyrdata.table包的方法可能(更快)在数据帧上进行分组操作.

  • rep也带有length.out参数,因此您可以将split(my_data_frame,rep(1:ceiling(nrow(df)/ chunk),each = chunk,length.out = nrow(df)))编写为在更复杂的情况下的替代方案。 (2认同)

小智 9

我有一个类似的问题并使用了这个:

library(tidyverse)
n = 100 #number of groups
split <- df %>% group_by(row_number() %/% n) %>% group_map(~ .x)
Run Code Online (Sandbox Code Playgroud)

从左到右:

  • 你将你的结果分配给split
  • df您从输入数据框开始
  • row_number然后使用模除法除以n(组数)来对数据进行分组。
  • 然后你只需将该组传递给group_map返回列表的函数即可。

所以最后你split是一个列表,每个元素中都有一组数据集。另一方面,您也可以通过将调用替换为group_map例如来立即写入数据group_walk(~ write_csv(.x, paste0("file_", .y, ".csv")))

您可以在以下位置找到有关这些强大工具的更多信息: 解释 group_by 的 dplyr 备忘单 以及下面的: group_map、group_walk 后续函数

  • 您可以缩短它并执行`df %&gt;% group_split(group_id = row_number() %/% n)`。或者在基数中,`split(df, seq(nrow(df)) %/% n)` (4认同)