Разбить фрейм данных на n случайных групп по x строк в каждой

#r

#r

Вопрос:

Предположим, что a data.frame выглядит следующим образом:

 df <- data.frame(name = paste0("Person",rep(1:30)),
                 number = sample(1:100, 30, replace=TRUE),
                 focus = sample(1:500, 30, replace=TRUE))
 

Я хочу разделить все вышесказанное data.frame на 9 групп, в каждой из которых по 9 наблюдений. Каждый пользователь может быть назначен нескольким группам (замена), так что все 9 групп имеют все 10 наблюдений (поскольку для 9 групп x 9 наблюдений требуется 81 строка, в то время как df имеет только 30).

В идеале результатом будет большой список из 1000 data.frames .

Есть ли какие-либо эффективные способы сделать это? Это всего лишь образец data.frame . Фактический df имеет ~ 10 тыс. строк и потребует 1000 групп, каждая из которых содержит 30 строк.

Большое спасибо.

Комментарии:

1. Можете ли вы проверить свой пост и немного уточнить (вы говорите о наблюдениях 9 против 10)?

2. Может быть: lapply(1:9, function(i) df[ sample(1:nrow(df), 9), ]) ?

Ответ №1:

Это то, что вы ищете?

 res <- replicate(1000, df[sample.int(nrow(df), 30, TRUE), ], FALSE)
 

df Я использовал

 df <- data.frame(name = paste0("Person",rep(1:1e4)),
                 number = sample(1:100, 1e4, replace=TRUE),
                 focus = sample(1:500, 1e4, replace=TRUE))
 

Вывод

 > res[1:3]
[[1]]
           name number focus
529   Person529      5   351
9327 Person9327      4   320
1289 Person1289     78   164
8157 Person8157     46   183
6939 Person6939     38    61
4066 Person4066     26   103
132   Person132     34    39
6576 Person6576     36   397
5376 Person5376     47   456
6123 Person6123     10    18
5318 Person5318     39    42
6355 Person6355     62   212
340   Person340     90   256
7050 Person7050     19   198
1500 Person1500     42   208
175   Person175     34    30
3751 Person3751     99   441
3813 Person3813     93   492
7428 Person7428     72   142
6840 Person6840     58    45
6501 Person6501     95   499
5124 Person5124     16   159
3373 Person3373     38    36
5622 Person5622     40   203
8761 Person8761      9   225
6252 Person6252     75   444
4502 Person4502     58   337
5344 Person5344     24   233
4036 Person4036     59   265
8764 Person8764     45     1

[[2]]
           name number focus
8568 Person8568     87   360
3968 Person3968     67   468
4481 Person4481     46   140
8055 Person8055     73   286
7794 Person7794     92   336
1110 Person1110      6   434
6736 Person6736      4    58
9758 Person9758     60    49
9356 Person9356     89   300
9719 Person9719    100   366
4183 Person4183      5   124
1394 Person1394     87   346
2642 Person2642     81   449
3592 Person3592     65   358
579   Person579     21   395
9551 Person9551     39   495
4946 Person4946     73    32
4081 Person4081     98   270
4062 Person4062     27   150
7698 Person7698     52   436
5388 Person5388     89   177
9598 Person9598     91   474
8624 Person8624      3   464
392   Person392     82   483
5710 Person5710     43   293
4942 Person4942     99   350
3333 Person3333     89    91
6789 Person6789     99   259
7115 Person7115    100   320
1431 Person1431     77   263

[[3]]
           name number focus
201   Person201    100   272
4674 Person4674     27   410
9728 Person9728     18   275
9422 Person9422      2   396
9783 Person9783     45    37
5552 Person5552     76   109
3871 Person3871     49   277
3411 Person3411     64    24
5799 Person5799     29   131
626   Person626     31   122
3103 Person3103      2    76
8043 Person8043     90   384
3157 Person3157     90   392
7093 Person7093     11   169
2779 Person2779     83     2
2601 Person2601     77   122
9003 Person9003     50   163
9653 Person9653      4   235
9361 Person9361    100   391
4273 Person4273     83   383
4725 Person4725     35   436
2157 Person2157     71   486
3995 Person3995     25   258
3735 Person3735     24   221
303   Person303     81   407
4838 Person4838     64   198
6926 Person6926     90   417
6267 Person6267     82   284
8570 Person8570     67   317
2670 Person2670     21   342
 

Комментарии:

1. Вау! Как я мог это упустить? Элегантно и быстро. Большое вам спасибо!