我正在处理一个大型数据集,该数据集需要作为子集才能在多个线程上同时运行。为了做到这一点,我需要将其分为N个子集,希望子集具有相同的大小。但是,我在表中有一个类别变量,并且我需要确保所有具有相同类别的内容都在同一子集中。有些类别只有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]
现在,您的数据将有一个名为column的列subset
,该列在类别中不会变化,但会将数据切成几乎相等大小的子集。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句