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 行。这更可取,因为我会丢弃更少的数据点。只要块至少有几千行,我不在乎它们的大小。
- 您需要为 sub-data.frame 至少确定您认为”好”的最大和最小行数。您不能对算法说”大约几千”…
- 如果对块的大小或最终得到的块的数量没有一些限制,这个问题就没有很好的定义。例如,使用等于 len(df) 的最大素数(不等于 len(df))的块大小将为您提供零剩余行,但您的块大小可能很小(我认为这是不希望的)。或者,使用等于 len(df) 的块大小也会产生零剩余行,但会导致块非常大(也可能是不希望的)。
- 的确,我是模棱两可的。我们可以说最少 4000 行,最多 10000 行吗?
这是一种蛮力方法(但非常快):
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 remainders <- nrows %% subSetSizes # > chunckSizesHavingMinRemainder # the remainder of 20752 / 5188 is indeed 0 (the only minimum) |
- 或者如果你不关心看到所有的可能性,就使用 which.min(remainders) …
- 找到 4000 到 10000 之间的素数列表会有帮助吗?
来源:https://www.codenong.com/25536658/