我有一个包含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”包没有帮助。
发布于 2021-02-23 19:05:06
以下是一种方法:
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逻辑是首先为每个V1和V2随机选择一行。然后,我们计算每个V1还需要多少行才能获得nr行,并从每个V1中随机采样它们,然后组合最终的dataset。
https://stackoverflow.com/questions/66331618
复制相似问题