【发布时间】:2011-10-26 23:29:55
【问题描述】:
我有一个由 400'000 行和大约 50 列组成的数据框。由于这个数据框非常大,因此计算量太大而无法使用。 我想将此数据帧拆分为更小的数据帧,之后我将运行我想运行的函数,然后在最后重新组装数据帧。
没有我想用来分割这个数据框的分组变量。我只想按行数拆分它。例如,我想将这个 400'000 行的表拆分为 400 个 1'000 行的数据帧。 我该怎么做?
【问题讨论】:
我有一个由 400'000 行和大约 50 列组成的数据框。由于这个数据框非常大,因此计算量太大而无法使用。 我想将此数据帧拆分为更小的数据帧,之后我将运行我想运行的函数,然后在最后重新组装数据帧。
没有我想用来分割这个数据框的分组变量。我只想按行数拆分它。例如,我想将这个 400'000 行的表拆分为 400 个 1'000 行的数据帧。 我该怎么做?
【问题讨论】:
制作您自己的分组变量。
d <- split(my_data_frame,rep(1:400,each=1000))
您还应该考虑plyr 包中的ddply 函数,或dplyr 中的group_by() 函数。
编辑为简洁起见,在 Hadley 的 cmets 之后。
如果您不知道数据框中有多少行,或者数据框的长度可能与您所需的块大小不相等,您可以这样做
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 包的方法可能会(很多)更快地对数据帧进行分组操作,例如像
(my_data_frame
%>% mutate(index=rep(1:ngrps,each=full_number)[seq(.data)])
%>% group_by(index)
%>% [mutate, summarise, do()] ...
)
还有很多个回答here
【讨论】:
split.data.frame而不是split?而且您不需要将分组变量强制转换为因子。
rep 也采用 length.out 参数,因此在更复杂的情况下,您可以编写 split(my_data_frame, rep(1:ceiling(nrow(df)/chunk), each=chunk, length.out=nrow(df))) 作为替代方案。
我有一个类似的问题并使用了这个:
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
【讨论】:
df %>% group_split(group_id = row_number() %/% n)。或者在基地,split(df, seq(nrow(df)) %/% n)