【问题标题】:Is there a subsetting function in R that allows me to balance subsets with conditions?R中是否有一个子集函数可以让我平衡子集和条件?
【发布时间】:2021-01-29 21:54:13
【问题描述】:

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

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

【问题讨论】:

    标签: r subset


    【解决方案1】:

    想到了一种使用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 的列,该列不会因类别而异,但会将您的数据分成几乎相同大小的子集。

    【讨论】:

    • 看起来很棒!今晚当我当前的过程完成时,我会试一试。非常感谢!
    • 我本来想早点写的,但是效果很好!
    • 很高兴它对你有用。我不确定它对于严重不平衡的类别有多强大,但我认为在创建 subset 字段时包含 order(N) 应该会有所帮助。
    猜你喜欢
    • 2021-01-07
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多