Split dataframe into equal parts based on length of the dataframe
问题:我需要将几个不同的大型数据帧(例如 50k 行)分成更小的块,每个块具有相同的行数。但是,我不想为每个数据集手动设置块的大小。相反,我想要这样的代码:
-
检查数据帧的长度并确定有多少块
大约几千行的原始数据框可以分解成 - 最小化必须丢弃的"剩余"行数
这里提供的答案是相关的:Split a vector into chunks in R
但是,我不想手动设置块大小。我希望代码找到将最小化剩余部分的"最佳"块大小。
示例:(基于 Harlan 在上述链接中的回答)
1 2 3 4 5 6 7 8 9 10 11 | df <- rnorm(20752) max <- 20 x <- seq_along(df) df <- split(df, ceiling(x/max)) str(df) > List of 5 > $ 1: num [1:5000] -1.4 -0.496 -1.185 -2.071 -1.118 ... > $ 2: num [1:5000] 0.522 1.607 -2.228 -2.044 0.997 ... > $ 3: num [1:5000] 0.295 0.486 -1.085 0.515 0.96 ... > $ 4: num [1:5000] 0.695 -0.58 -1.676 1.052 1.266 ... > $ 5: num [1:752] -0.6468 0.1731 0.5788 -0.0584 0.8479 ... |
如果我选择了 4100 行的块大小,我将有 5 个块,其余为 252 行。这更可取,因为我会丢弃更少的数据点。只要块至少有几千行,我不在乎它们的大小。
这是一种蛮力方法(但非常快):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # number of rows of your data.frame (from your example... ) nrows <- 20752 # acceptable range for sub-data.frame size subSetSizes <- 4000:10000 remainders <- nrows %% subSetSizes minIndexes <- which(remainders == min(remainders)) chunckSizesHavingMinRemainder <- subSetSizes[minIndexes] # > chunckSizesHavingMinRemainder # [1] 5188 # the remainder of 20752 / 5188 is indeed 0 (the only minimum) # nrows %% 5188 # > [1] 0 |