带有 dbplyr 条件的随机样本
Random sample with conditions in r with dbplyr
我有一个数据框,我必须 select 5 个人至少有 3 行。所以我的想法是,我为至少 3 行或更多的每个 id 随机抽样。数据如下所示:
head(df)
id year sex education no_kids health_org satisf_org health_std
1 312 2004 1 NA 1 4 7 0.5670103
2 399 2000 0 12 1 4 8 0.5670103
3 399 2001 0 12 1 4 9 0.5670103
4 457 2000 0 18 0 3 8 -0.4639175
5 457 2002 0 18 0 3 7 -0.4639175
6 457 2004 0 18 0 2 4 -1.4948454
satisf_std
1 -0.09090909
2 0.47727272
3 1.04545450
4 0.47727272
5 -0.09090909
6 -1.79545450
我已经创建了一种方法来执行此操作,但结果还不够好。它看起来像这样:
library(dplyr)
sample_n_groups = function(grouped_df, size, replace = FALSE, weight=NULL) {
grp_var <- grouped_df %>%
groups %>%
unlist %>%
as.character
random_grp <- grouped_df %>%
summarise() %>%
sample_n(size, replace, weight) %>%
mutate(unique_id = 1:NROW(.))
grouped_df %>%
right_join(random_grp, by=grp_var) %>%
group_by_(grp_var)
}
df_sample <- df %>% filter(n() >= 3) %>% group_by(id) %>% sample_n_groups(5)
有人有不同的方法吗?
你可以试试这个:
library(dplyr)
df %>%
group_by(id) %>%
filter(n() >= 3) %>%
distinct(id) %>%
slice_sample(n = 5) %>%
#For older version of dplyr
#sample_n(5)
left_join(df, by = 'id') -> df_sample
这里我们首先保留 id
的行,其中至少有 3 行,select distinct
id
来自它们并从中采样 5 个 id .使用 left_join
我们然后 select 那些 id
的所有行。
我有一个数据框,我必须 select 5 个人至少有 3 行。所以我的想法是,我为至少 3 行或更多的每个 id 随机抽样。数据如下所示:
head(df)
id year sex education no_kids health_org satisf_org health_std
1 312 2004 1 NA 1 4 7 0.5670103
2 399 2000 0 12 1 4 8 0.5670103
3 399 2001 0 12 1 4 9 0.5670103
4 457 2000 0 18 0 3 8 -0.4639175
5 457 2002 0 18 0 3 7 -0.4639175
6 457 2004 0 18 0 2 4 -1.4948454
satisf_std
1 -0.09090909
2 0.47727272
3 1.04545450
4 0.47727272
5 -0.09090909
6 -1.79545450
我已经创建了一种方法来执行此操作,但结果还不够好。它看起来像这样:
library(dplyr)
sample_n_groups = function(grouped_df, size, replace = FALSE, weight=NULL) {
grp_var <- grouped_df %>%
groups %>%
unlist %>%
as.character
random_grp <- grouped_df %>%
summarise() %>%
sample_n(size, replace, weight) %>%
mutate(unique_id = 1:NROW(.))
grouped_df %>%
right_join(random_grp, by=grp_var) %>%
group_by_(grp_var)
}
df_sample <- df %>% filter(n() >= 3) %>% group_by(id) %>% sample_n_groups(5)
有人有不同的方法吗?
你可以试试这个:
library(dplyr)
df %>%
group_by(id) %>%
filter(n() >= 3) %>%
distinct(id) %>%
slice_sample(n = 5) %>%
#For older version of dplyr
#sample_n(5)
left_join(df, by = 'id') -> df_sample
这里我们首先保留 id
的行,其中至少有 3 行,select distinct
id
来自它们并从中采样 5 个 id .使用 left_join
我们然后 select 那些 id
的所有行。