R 中是否有一个子集函数可以让我根据条件平衡子集?

Is there a subsetting function in R that allows me to balance subsets with conditions?

我正在处理一个大型数据集,它需要同时在多个线程上成为 运行 的子集。为此,我需要将其分成 N 个子集,希望这些子集的大小大致相同。但是,我在 table 中有一个类别变量,我需要确保具有相同类别的所有内容都在同一子集中。有些类别只有 2 行,但有些类别最多可能有 2,000 行。更高的优先级是没有类别跨越超过一个子集,所以如果我有一个包含 5,000 行的数据集,并且 3,000 行在一个类别中,并且我分成三个子集,我将拥有这 3,000 个中的一个,并且然后再增加两个,大约 1,000 个。

我正在考虑使用 table() 命令来预加载每个类别的频率,但我在弄清楚如何自动进行子集化方面有点受阻。

我想到了一种使用 data.table 的方法,它与您使用 table 的计划有点类似,但希望能使其更加自动化和通用。

方法基本上是查看每个 category 内的计数,计算所有类别的累积计数,然后 cut 将累积总和值分成 nSubsets(大约)大小相等的组:

library(data.table)

## dummy up some data;
dt <- data.table(category = rep(1:256, sample(2:2000, 256, replace = T)))
## view couts by category;
dt[, .N, by = category]

# how many subsets do you want?;
nSubsets <- 4

## here we will assign each category value to a subset;
dt[, .(.N),
   by = .(category)][order(N), .(category,
                         subset = cut(cumsum(N), breaks = nSubsets))]

## join above to your data;
dt[dt[, .(.N),
      by = .(category)][order(N), .(category,
                            subset = cut(cumsum(N), breaks = nSubsets))],
   subset := i.subset,
   on = "category"]


dt
dt[, .N, by = subset]

现在,您的数据将有一个名为 subset 的列,该列不会因类别而异,但会将您的数据分成大小几乎相同的子集。