【问题标题】:R- Sample random row per group until reaching max number of rowsR- 每组随机采样行,直到达到最大行数
【发布时间】:2020-11-03 16:14:35
【问题描述】:

我有一个数据集,我想按组随机抽取最多 30 行的样本。但是,我还想确保至少包含 1 行用于另一个分组。此外,某些组的行数少于 30,在这种情况下,应包括该组的所有行。我无法包含我正在使用的确切数据集,因为它是专有的;但是,数据框 df 的示例是:

ID|年龄|州|性别|薪水

1 25 厘米 50000
2 34 厘米 72000
3 28 厘米 52000
4 25 CO F 44000
5 25 CA F 55000
6 34 CA F 100000
7 39 CA M 88000
8 34 CA M 59000
...最多 15000 行

所以,我想要一个数据集的随机样本,这样每个州给出的行数不超过 30 行。然后,对于每个州,我希望数据集中存在的每个年龄和性别至少有 1 行。如果给定州的年龄/性别组合少于 30 个,但该州的行数超过 30 行,则样本应包括给定年龄/性别的多行,以便为该州提供 30 行。如果该州的行数少于 30,那么我想要该州的数据集中的所有行。如果给定州的年龄/性别组合超过 30 个,则样本应各有 1 个,最多 30 个。

我有办法在 R 中做到这一点吗?

【问题讨论】:

  • 欢迎来到 SO!发布问题时,您会发现提供易于重现的代码和您期望(或希望)结果的模拟版本最有帮助。例如,使用 dput(head(data,20)) 提供数据样本有助于我们更快地开始帮助您。

标签: r random dplyr sample


【解决方案1】:

这里有一些代码可以帮助您完成一半。首先,我模拟了与您的数据相似的数据。

df <-
  data.frame(
    ID = 1:1500,
    Age = sample(18:99, 1500, replace = TRUE),
    State = sample(state.abb, 1500, replace = TRUE),
    Gender = sample(c("M", "F"), 1500, replace = TRUE),
    Salary = sample(44:100 * 1000, 1500, replace = TRUE)
  )

然后使用group_by(),您可以创建状态分组,使用mutate()n() 确定每个状态的行。然后,该信息可用于使用sample_n() 抽取样本,并根据组大小进行调整。

library(dplyr)
df %>% 
  group_by(State) %>% 
  mutate(n_state = n()) %>% 
  sample_n(ifelse(n >= 30, 30, n))

这可以扩展为计算您提到的更多组大小,以使用该信息确保您达到所需的配额。不幸的是,我不完全了解您的问题的配额。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多