Выбор случайных точек на уникальный идентификатор в R - PullRequest
1 голос
/ 15 апреля 2020

Один из моих предыдущих вопросов был очень похож на этот.

Давайте создадим этот случайный набор данных -

df<- data.frame(ani_id = as.factor(1:10), x_data = rnorm(500), y_data=rnorm(500))
> head(df)
  ani_id     x_data     y_data
1      1 -0.8832187  0.5080067
2      2 -0.2823767 -0.4060133
3      3 -1.5890646 -1.3499005
4      4  1.8312746  1.0803899
5      5  1.5814911  0.1227741
6      6  1.6500048 -0.2849130

У меня есть уникальный идентификатор от 1 до 10. и еще 2 столбцы с данными по осям x и y.

Мне нужно 5 случайных точек для каждого идентификатора.

То, что я пробовал, -

df_sub<- do.call(rbind, by(df, df$ani_id, head, 5))

Это даст мне первые 5 баллов за ID не случайны. Я знаю, что могу использовать выборку, но когда я использую выборку, я получаю 5 случайных точек от df, а не 5 случайных точек за ID.

Я знаю, что это очень основа c, но я действительно не мог получить вокруг этого пока нет.

Любая помощь очень ценится. :)

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

С помощью data.table вы можете применить функцию к группе, используя глагол .SD ( Подмножество данных ). В вашем случае вы хотите произвести выборку, скажем, с заменой

df <- data.frame(ani_id = as.factor(1:10), x_data = rnorm(500), y_data=rnorm(500))

library(data.table)

setDT(df)
df[, lapply(.SD, sample, .N, size = 5), by = "ani_id"]

.N здесь, чтобы сказать, что мы выбираем от 1 до количества наблюдений в группе.

Выход :

    ani_id      x_data      y_data
 1:      1  0.81210424 -0.43155131
 2:      1 -1.14088114  1.58057721
 3:      1  0.06865298  0.66988620
 4:      1 -1.60254398  1.15035575
 5:      1 -0.36304871  0.66988620
 6:      2  0.95519426 -0.55430457
 7:      2  0.53378403 -0.10214398
 8:      2 -0.94015859 -1.12178243
 9:      2 -0.94015859 -0.54368006
10:      2  1.10156682 -1.55819890
11:      3 -0.66934194  1.20712519
12:      3 -0.45282335  1.42100642
13:      3  0.20274374 -0.92261343
14:      3 -0.89429015 -0.08322267
15:      3 -0.45282335 -0.76849105
16:      4 -0.33635193  0.32739748
17:      4 -0.51244630  1.04049548
18:      4 -0.51244630  0.14979289
19:      4  0.48511418  0.13926790
20:      4  2.03382889  1.51772346
21:      5  0.67217967 -1.42806565
22:      5  2.20230044  0.12381176
23:      5  1.47995961 -0.71651449
24:      5  0.15592027  1.00399878
25:      5 -2.04760590 -0.08162096
26:      6 -0.70265235 -0.24097530
27:      6  0.04863560  1.24983393
28:      6  0.56252090 -0.86735582
29:      6 -0.44686943  1.45452967
30:      6 -0.16262549 -0.01227861
31:      7 -0.25934089  1.25422436
32:      7 -0.17041086 -0.03984203
33:      7  0.94523241 -0.39190371
34:      7 -0.46559718  1.57288706
35:      7  0.29093588 -1.11361543
36:      8  2.03011563 -0.84065967
37:      8  0.04606141 -1.09644922
38:      8 -2.07313897 -1.10129398
39:      8 -0.18617530 -0.83920602
40:      8  0.77031457  0.96516086
41:      9  0.45411183 -1.10877598
42:      9 -0.98211896  0.10769514
43:      9 -2.59020795 -1.43687674
44:      9  0.35394471  0.31910079
45:      9 -0.63453267 -2.15948240
46:     10 -0.41591389 -1.96997799
47:     10 -0.18099801 -0.75883730
48:     10 -0.18099801  1.06453895
49:     10  0.47289655 -1.76546082
50:     10 -0.35131470 -1.46599203
    ani_id      x_data      y_data
0 голосов
/ 15 апреля 2020

Мы можем использовать sample_n после группировки по 'ani_id'

library(dplyr)
df %>%
    group_by(ani_id) %>%
    sample_n(5)
# A tibble: 50 x 3
# Groups:   ani_id [10]
#   ani_id  x_data  y_data
#   <fct>    <dbl>   <dbl>
# 1 1       0.801  -1.19  
# 2 1      -0.255  -0.218 
# 3 1      -0.0337  0.924 
# 4 1      -0.287   0.0856
# 5 1      -1.47   -1.73  
# 6 2       0.916  -0.849 
# 7 2       0.620  -0.151 
# 8 2      -0.529   1.02  
# 9 2       0.0470  1.15  
#10 2      -0.904  -1.98  
# … with 40 more rows

data

set.seed(24)
df<- data.frame(ani_id = as.factor(1:10),
         x_data = rnorm(500), y_data=rnorm(500))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...