【问题标题】:R - setting equiprobability over a specific variable when samplingR - 在采样时设置特定变量的等概率
【发布时间】:2015-01-08 02:10:39
【问题描述】:

我有一个包含超过 200 万个条目的数据集,我将它们加载到数据框中。

我正在尝试获取数据的子集。我需要大约 10000 个条目,但我需要在一个变量上以相等的概率选择条目。

这是我的数据在str(data) 下的样子:

'data.frame':   2685628 obs. of  3 variables:
$ category   : num  3289 3289 3289 3289 3289 ...
$ id: num  8064180 8990447 747922 9725245 9833082 ...
$ text    : chr  "text1" "text2" "text3" "text4" ...

您已经注意到我有 3 个变量:类别、id 和文本。

我尝试了以下方法:

> sample_data <- data[sample(nrow(data),10000,replace=FALSE),]

这当然可行,但如果不相等,则样本的概率。这是count(sample_data$category) 的输出:

      x freq
1  3289  707
2  3401  341
3  3482  160
4  3502  243
5  3601 1513
6  3783  716
7  4029  423
8  4166   21
9  4178  894
10 4785   31
11 5108  121
12 5245 2178
13 5637  387
14 5946 1484
15 5977  117
16 6139  664

更新:这是count(data$category)的输出:

  x   freq
1  3289 198142
2  3401  97864
3  3482  38172
4  3502  59386
5  3601 391800
6  3783 201409
7  4029 111075
8  4166   6749
9  4178 239978
10 4785   6473
11 5108  32083
12 5245 590060
13 5637  98785
14 5946 401625
15 5977  28769
16 6139 183258

但是当我尝试设置概率时,我得到以下错误:

> catCount <- length(unique(data$category))
> probabilities <- rep(c(1/catCount),catCount)
> train_set <- data[sample(nrow(data),10000,prob=probabilities),]
Error in sample.int(x, size, replace, prob) : 
incorrect number of probabilities

我知道示例函数在行号之间随机选择,但我不知道如何将其与类别的概率相关联。

问题:如何在类别变量的等概率上对我的数据进行抽样?

提前致谢。

【问题讨论】:

  • 也许可以从我的“splitstackshape”包中查看stratified 函数?
  • 这看起来很有趣。我不知道那个包。我来看看。谢谢
  • 您是否尝试为每个唯一 x 获取相同数量的案例?
  • 是的,这正是我想要实现的目标。
  • 也许也很有趣的是来自包 dplyr sample_n 和 sample_frac 与 group_by 结合。

标签: r


【解决方案1】:

我想你可以通过一些简单的基本 R 操作来做到这一点,但你应该记住,你在 sample 中使用了概率,因此每个组合获得 exact 的数量是行不通的使用这种方法,虽然你可以得到足够大的样本。

这是一个示例数据

set.seed(123)
data <- data.frame(category = sample(rep(letters[1:10], seq(1000, 10000, by = 1000)), 55000))

然后

probs <- 1/prop.table(table(data$category)) # Calculating relative probabilities
data$probs <- probs[match(data$category, names(probs))] # Matching them to the correct rows
set.seed(123)
train_set <- data[sample(nrow(data), 1000, prob = data$probs), ] # Sampling
table(train_set$category) # Checking frequencies
#  a   b   c   d   e   f   g   h   i   j 
# 94 103  96 107 105  99 100  96 107  93 

编辑:所以这是一个可能的 data.table 等效项

library(data.table)
setDT(data)[, probs := .N, category][, probs := .N/probs]
train_set <- data[sample(.N, 1000, prob = probs)]

编辑#2:这是一个非常好的解决方案,使用@Khashaa 和@docendodiscimus 提供的dplyr

这个解决方案的好处是它返回每个组内的精确样本大小

library(dplyr)
train_set <- data %>% 
             group_by(category) %>% 
             sample_n(1000)

编辑#3: 看来data.table 相当于dplyr::sample_n 会是

library(data.table)
train_set <- setDT(data)[data[, sample(.I, 1000), category]$V1]

这也将返回每个组内的精确样本大小

【讨论】:

  • @DavidArenburg 我在你的帖子中寻找data.table 的解决方案,结果很失望:-)
  • @akrun,已添加。虽然不确定它是最佳的
  • 为了完整起见,能不能也加个dplyr?
  • 什么?没有library(splitstackshape); stratified(data, "category", 1000)? :-(
  • @AnandaMahto 我不确定sample_n 在下面是否冗长,只是在上面看起来不错。如果您创建了一个不错的data.table 替代sample_n,它肯定会很有用。无论哪种方式,我建议您对其功能进行一些介绍,这可能对未来的读者 IMO 有益。
猜你喜欢
  • 1970-01-01
  • 2020-08-28
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
  • 2018-06-08
  • 1970-01-01
  • 2013-08-10
相关资源
最近更新 更多