【问题标题】:Split up a dataframe by number of rows按行数拆分数据框
【发布时间】:2011-10-26 23:29:55
【问题描述】:

我有一个由 400'000 行和大约 50 列组成的数据框。由于这个数据框非常大,因此计算量太大而无法使用。 我想将此数据帧拆分为更小的数据帧,之后我将运行我想运行的函数,然后在最后重新组装数据帧。

没有我想用来分割这个数据框的分组变量。我只想按行数拆分它。例如,我想将这个 400'000 行的表拆分为 400 个 1'000 行的数据帧。 我该怎么做?

【问题讨论】:

    标签: r split dataframe


    【解决方案1】:

    制作您自己的分组变量。

    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)
    

    对于未来的读者,基于 dplyrdata.table 包的方法可能会(很多)更快地对数据帧进行分组操作,例如像

    (my_data_frame 
       %>% mutate(index=rep(1:ngrps,each=full_number)[seq(.data)])
       %>% group_by(index)
       %>% [mutate, summarise, do()] ...
    )
    

    还有很多个回答here

    【讨论】:

    • 谢谢!效果很好!是的,我会研究 plyr 包,因为它看起来非常有用。
    • 你为什么使用split.data.frame而不是split?而且您不需要将分组变量强制转换为因子。
    • 这似乎只有在您知道要输出多少数据帧的情况下才有效。如果您不知道将生成多少数据帧,尤其是对于您希望将其拆分为不超过一定行数的较小数据帧的可变长度数据帧,您将如何使用它?
    • rep 也采用 length.out 参数,因此在更复杂的情况下,您可以编写 split(my_data_frame, rep(1:ceiling(nrow(df)/chunk), each=chunk, length.out=nrow(df))) 作为替代方案。
    • data.table 和 dplyr 选项是什么?
    【解决方案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

    【讨论】:

    • 你可以缩短这个并做df %&gt;% group_split(group_id = row_number() %/% n)。或者在基地,split(df, seq(nrow(df)) %/% n)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2016-06-27
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多