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
的列,该列不会因类别而异,但会将您的数据分成大小几乎相同的子集。
我正在处理一个大型数据集,它需要同时在多个线程上成为 运行 的子集。为此,我需要将其分成 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
的列,该列不会因类别而异,但会将您的数据分成大小几乎相同的子集。