首页 > 解决方案 > 在 R 中为每个唯一 ID 选择随机点

问题描述

我之前的一个问题与这个非常相似。

让我们创建这个随机数据集-

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

我有唯一的 ID 1 到 10。还有另外 2 个带有 x 和 y 轴数据的列。

我需要的是每个 ID 5 个随机点。

我尝试过的是-

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

这会给我每个 ID 的前 5 分,而不是随机的。我知道我可以使用样本,但是当我使用样本时,我从 df 获得 5 个随机点,而不是每个 ID 获得 5 个随机点。

我知道这是非常基本的,但我真的无法解决这个问题。

任何帮助都非常受欢迎。:)

标签: r

解决方案


您可以使用动词(数据子集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

推荐阅读