生成依赖于列的引导程序样本

时间:2019-03-08 07:50:17

标签: r dplyr sampling resampling

我有一个这样的数据集

set.seed(1)
df <- data.frame(ID = rep(1:4, each = 3),
                 x = c(1,2,3,2,3,4,1,2,3,3,4,5),
                 V1 = rnorm(12))

> df
   ID x         V1
1   1 1 -0.6264538
2   1 2  0.1836433
3   1 3 -0.8356286
4   2 2  1.5952808
5   2 3  0.3295078
6   2 4 -0.8204684
7   3 1  0.4874291
8   3 2  0.7383247
9   3 3  0.5757814
10  4 3 -0.3053884
11  4 4  1.5117812
12  4 5  0.3898432

此示例包含由ID定义的4个人。 每个人都有一个观察期x。例如,在时间1,2,3观察到ID 1。

在此示例中,我在时间点1(ID 1和ID 3)有2个观测值, 和在时间点2的3个观察(ID 1,2,3)

我现在想要一个自举(带替换样本)数据集,该数据集在每个时间点包含相同数量的观察值。

在此示例中,数据集可能如下所示:

> df
   ID x         V1
1   1 1 -0.6264538
1   1 1 -0.6264538
2   1 2  0.1836433
2   1 2  0.1836433
3   1 3 -0.8356286
4   2 2  1.5952808
5   2 3  0.3295078
6   2 4 -0.8204684
6   2 4 -0.8204684
7   3 1  0.4874291
7   3 1  0.4874291
8   3 2  0.7383247
9   3 3  0.5757814
10  4 3 -0.3053884
11  4 4  1.5117812
11  4 4  1.5117812
12  4 5  0.3898432
12  4 5  0.3898432
12  4 5  0.3898432
12  4 5  0.3898432

此数据集现在在每个时间点都有4个观测值。

1 个答案:

答案 0 :(得分:2)

我们首先可以找到发生x的最大次数,并为每个sample_nx分别replace = TRUE获得每个x的相等行数

max_sample <- max(table(df$x))

library(dplyr)

df %>%
  group_by(x) %>%
  sample_n(max_sample, replace = TRUE) %>%
  arrange(x)

#      ID     x     V1
#   <int> <dbl>  <dbl>
# 1     3     1  0.487
# 2     1     1 -0.626
# 3     1     1 -0.626
# 4     1     1 -0.626
# 5     3     2  0.738
# 6     2     2  1.60 
# 7     2     2  1.60 
# 8     3     2  0.738
# 9     4     3 -0.305
#10     2     3  0.330
#11     2     3  0.330
#12     4     3 -0.305
#13     4     4  1.51 
#14     4     4  1.51 
#15     4     4  1.51 
#16     4     4  1.51 
#17     4     5  0.390
#18     4     5  0.390
#19     4     5  0.390
#20     4     5  0.390