首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:不同样本大小的分组样本

R:不同样本大小的分组样本
EN

Stack Overflow用户
提问于 2021-02-23 18:44:48
回答 1查看 22关注 0票数 0

我有一个包含2个分组列V1和V2的数据框。我想为V1中的每个不同的值精确地采样n=4个元素,并确保在V2中的每个不同的元素中至少采样m=1。

代码语言:javascript
复制
library(tidyverse)
set.seed(1)
df = data.frame(
  V1 = c(rep("A",6), rep("B",6)),
  V2 = c("C","C","D","D","E","E","F","F","G","G","H","H"),
  V3 = rnorm(12)
)

df
   V1 V2         V3
1   A  C -0.6264538
2   A  C  0.1836433
3   A  D -0.8356286
4   A  D  1.5952808
5   A  E  0.3295078
6   A  E -0.8204684
7   B  F  0.4874291
8   B  F  0.7383247
9   B  G  0.5757814
10  B  G -0.3053884
11  B  H  1.5117812
12  B  H  0.3898432

例如,我想要的输出是...

代码语言:javascript
复制
V1    V2        V3
1 A     C     -0.626
2 A     D     -0.836
3 A     E     -0.820
4 A     E      0.329
5 B     F      0.487
6 B     G      0.576
7 B     G     -0.305
8 B     H      0.390

我不知道如何生成此输出。当我按V1和V2分组时,对于V1中的每个不同值,我得到n=3个元素。

代码语言:javascript
复制
df %>%
  group_by(V1,V2) %>%
  sample_n(1)

  V1    V2        V3
1 A     C     -0.626
2 A     D     -0.836
3 A     E     -0.820
4 B     F      0.487
5 B     G      0.576
6 B     H      0.390

"splitstackshape“或"sampling”包没有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-23 19:05:06

以下是一种方法:

代码语言:javascript
复制
library(dplyr)

nr <- 4
first_pass <- df %>% group_by(V1, V2) %>% sample_n(1) %>% ungroup

first_pass %>% 
  count(V1) %>% 
  mutate(n = nr - n) %>%
  left_join(df, by = 'V1') %>%
  group_by(V1) %>%
  sample_n(first(n)) %>%
  select(-n) %>%
  bind_rows(first_pass) %>%
  arrange(V1, V2)

#  V1    V2        V3
#  <chr> <chr>  <dbl>
#1 A     C      0.184
#2 A     D     -0.836
#3 A     E     -0.820
#4 A     E     -0.820
#5 B     F      0.487
#6 B     F      0.738
#7 B     G     -0.305
#8 B     H      0.390

逻辑是首先为每个V1V2随机选择一行。然后,我们计算每个V1还需要多少行才能获得nr行,并从每个V1中随机采样它们,然后组合最终的dataset。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66331618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档