R:具有不同样本大小的样本
R: sample with different sample sizes for groups
我有一个包含 2 个分组列 V1 和 V2 的数据框。我想为 V1 中的每个不同值精确地采样 n = 4 个元素,并确保对 V2 中的每个不同元素至少采样 m = 1。
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
我想要的输出例如是...
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 个元素。
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”包没有帮助。
这是一种方法:
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
逻辑是首先随机 select 1 行,每个 V1
和 V2
。然后,我们为每个 V1
计算我们需要多少行才能获得 nr
行,并从每个 V1
中随机抽取它们并组合最终数据集。
我有一个包含 2 个分组列 V1 和 V2 的数据框。我想为 V1 中的每个不同值精确地采样 n = 4 个元素,并确保对 V2 中的每个不同元素至少采样 m = 1。
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
我想要的输出例如是...
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 个元素。
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”包没有帮助。
这是一种方法:
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
逻辑是首先随机 select 1 行,每个 V1
和 V2
。然后,我们为每个 V1
计算我们需要多少行才能获得 nr
行,并从每个 V1
中随机抽取它们并组合最终数据集。