我有一个数据框,
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
但收到错误。
是否有执行此操作的最佳方法?可以使用大量簇和样本进行扩展的解决方案将是理想的。
先谢谢您!
答案 0 :(得分:4)
我们可以将map2_df
与split
一起使用:
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_df
将sample_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