【问题标题】:R data.table - sample by group with different sampling proportionR data.table - 以不同采样比例按组采样
【发布时间】:2020-02-12 04:47:25
【问题描述】:

我想有效地从data.table 中按组进行随机抽样,但应该可以为每组抽样不同的比例。

如果我想从每个组中抽取sampling_fraction 的分数,我可以从this 问题和related 答案中得到启发来做类似的事情:

DT = data.table(a = sample(1:2), b = sample(1:1000,20))

group_sampler <- function(data, group_col, sample_fraction){
  # this function samples sample_fraction <0,1> from each group in the data.table
  # inputs:
  #   data - data.table
  #   group_col - column(s) used to group by
  #   sample_fraction - a value between 0 and 1 indicating what % of each group should be sampled
  data[,.SD[sample(.N, ceiling(.N*sample_fraction))],by = eval(group_col)]
}

# what % of data should be sampled
sampling_fraction = 0.5

# perform the sampling
sampled_dt <- group_sampler(DT, 'a', sampling_fraction)

但是,如果我想从第 1 组中抽取 10%,从第 2 组中抽取 50%,该怎么办?

【问题讨论】:

  • 你如何定义哪个是第 1 组,哪个是第 2 组
  • 在上面的例子中,列 'a' 的值是 1 和 2。因此,组 a 和组 2。我认为为了确保为每个组分配正确的采样分数,它可能可以在函数的输入中使用命名向量或类似的东西。我只是不确定该怎么做

标签: r data.table oversampling


【解决方案1】:

您可以使用.GRP,但要确保匹配正确的组。您可能希望将group_col 定义为因子变量。

group_sampler <- function(data, group_col, sample_fractions) {
  # this function samples sample_fraction <0,1> from each group in the data.table
  # inputs:
  #   data - data.table
  #   group_col - column(s) used to group by
  #   sample_fraction - a value between 0 and 1 indicating what % of each group should be sampled
  stopifnot(length(sample_fractions) == uniqueN(data[[group_col]]))
  data[, .SD[sample(.N, ceiling(.N*sample_fractions[.GRP]))], keyby = group_col]
}

根据 chinsoon12 的评论进行编辑:

函数的最后一行会更安全(而不是依赖于正确的顺序):

data[, .SD[sample(.N, ceiling(.N*sample_fractions[[unlist(.BY)]]))], keyby = group_col]

然后你将sample_fractions 作为命名向量传递:

group_sampler(DT, 'a', sample_fractions= c(x = 0.1, y = 0.9))

【讨论】:

  • @chinsoon12 你能举个简短的例子吗?
【解决方案2】:

这是一个使用查找表的选项(因此不依赖于向量或组的顺序)。

library(data.table)
DT = data.table(group = sample(1:2), val = sample(1:1000,20))

sample_props <- data.table(group = 1:2, prop = c(.1,.5))

group_sampler <- function(data, group_col, sample_props){
  # this function samples sample_fraction <0,1> from each group in the data.table
  # inputs:
  #   data - data.table with data
  #   group_col - column(s) used to group by (must be in both data.tables)
  #   sample_props - data.table with sample proportions
  ret <- merge(DT, sample_props, by = group_col)
  ret <- ret[,.SD[sample(.N, ceiling(.N*prop))], eval(group_col)]
  return(ret[,prop := NULL][])
}

# perform the sampling
group_sampler(DT, 'group', sample_props)
#>    group val
#> 1:     1 721
#> 2:     2 542
#> 3:     2 680
#> 4:     2 613
#> 5:     2 170
#> 6:     2 175

reprex package (v0.3.0) 于 2019 年 10 月 15 日创建

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多