генерировать пример начальной загрузки в зависимости от столбца - PullRequest
0 голосов
/ 08 марта 2019

У меня есть такой набор данных

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

, этот пример содержит 4 человека, определенных как ID.Каждый человек имеет период наблюдения x.Например, ID 1 наблюдается в моменты времени 1,2,3.

. В этом примере у меня есть 2 наблюдения в момент времени 1 (ID 1 и ID 3) и 3 наблюдения в момент времени 2 (ID 1, 2,3)

Теперь я хочу получить набор данных начальной загрузки (выборка с заменой), который содержит одинаковое количество наблюдений в каждый момент времени.

В этом примере набор данных может выглядеть следующим образомthis:

> 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 Ответ

2 голосов
/ 08 марта 2019

Сначала мы можем найти максимальное количество раз, когда x происходит и sample_n для каждого x с помощью 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
...