每个群集的样本数在R中变化的采样

时间:2019-01-09 16:09:32

标签: r sample

我有一个数据框,

tr

我还有一组集群ID和每个集群中我想要的样本数量,

df<-data.frame(id=c(1,2,3,4,5,6,7,8,9,10,11),score=c(1,3,5,7,3,4,7,1,2,6,3),cluster=c(1,1,2,2,2,2,3,3,3,3,3))

我希望有一个样本数据帧,该数据帧由根据sample_sizes<-data.frame(cluster=c(1,2,3),samples=c(1,3,2)) 数据帧中指定的样本数选择的样本组成。

例如,下表可能是结果:

sample_sizes

我使用id score cluster 2 3 1 3 4 2 5 3 2 6 4 2 9 2 3 11 3 3 查看了以下内容:

dplyr

但收到错误。

是否有执行此操作的最佳方法?可以使用大量簇和样本进行扩展的解决方案将是理想的。

先谢谢您!

2 个答案:

答案 0 :(得分:4)

我们可以将map2_dfsplit一起使用:

map2_df(split(df, df$cluster), sample_sizes$samples, sample_n)
#   id score cluster
# 1  1     1       1
# 2  4     7       2
# 3  5     3       2
# 4  3     5       2
# 5  7     7       3
# 6  9     2       3

split(df, df$cluster)给出一个数据帧列表,每个群集一个,然后map2_dfsample_n应用于每个群集,就像您想要的那样,然后将结果数据帧绑定为一个。

答案 1 :(得分:1)

这是使用tidyr::nest()purrr::map2的一种方式

library(tidyverse)
df %>% group_by(cluster) %>% nest() %>% 
       left_join(sample_sizes) %>% mutate(samp=map2(data,samples,sample_n)) %>% 
       select(cluster,samples,samp) %>% unnest()

Joining, by = "cluster"
# A tibble: 6 x 4
  cluster samples    id score
    <dbl>   <dbl> <dbl> <dbl>
1       1       1     1     1
2       2       3     5     3
3       2       3     6     4
4       2       3     4     7
5       3       2     8     1
6       3       2    10     6