【问题标题】:Different sample number for each group in a data set数据集中每组的不同样本数
【发布时间】:2016-07-04 12:39:08
【问题描述】:

给定一个数据集

key <- rep(c('a', 'b', 'c'), 10)
value <- sample(30)
df <- data.frame(key, value)

我想在键中为每个组提供不同数量的样本,使用 dplyr 的简单代码显然不适用于此任务

ns <- c('a'= 1, 'b'= 2, 'c' = 3)
df %>%
mutate(n_s = ns[key]) %>%
group_by(key) %>%
sample_n(n_s) 

有一些解决方案看起来就这么简单吗?

【问题讨论】:

  • 一个有趣的 data.table 版本 - df[df[, sample(.I, ns[match(unlist(.BY), names(ns))]), by=key]$V1,]

标签: r dplyr plyr tidyr


【解决方案1】:

您可以查看我的“splitstackshape”包中的stratified 函数:

library(splitstackshape)
ns <- c('a'= 1, 'b'= 2, 'c' = 3)
stratified(df, "key", size = ns)
#    key value
# 1:   a     7
# 2:   b    10
# 3:   b    13
# 4:   c     4
# 5:   c    20
# 6:   c     9

【讨论】:

    【解决方案2】:

    您可以使用mapplysplit(df, df$key)ns 作为参数,但请注意ns 的名称不使用。计算的是groups的顺序,如果groups的数量与ns的长度不匹配,则ns会被回收。

    set.seed(129)
    mapply(sample_n, split(df, df$key), ns, SIMPLIFY = FALSE) %>%
      rbind_all
    #     key value
    #  (fctr) (int)
    #1      a    29
    #2      b    14
    #3      b    22
    #4      c    10
    #5      c    24
    #6      c     3
    

    【讨论】:

    • 甜蜜!如果您按名称 ns[order(names(ns))] 对 ns 进行排序,此解决方案将更通用
    猜你喜欢
    • 2015-08-22
    • 2021-01-14
    • 2021-07-30
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2022-11-28
    • 2016-09-10
    相关资源
    最近更新 更多