【问题标题】:Selecting random points per unique ID in R在 R 中为每个唯一 ID 选择随机点
【发布时间】:2020-04-15 16:43:52
【问题描述】:

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

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

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


    【解决方案1】:

    使用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
    

    【讨论】:

      【解决方案2】:

      我们可以通过'ani_id'分组后使用sample_n

      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
      

      数据

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

      【讨论】:

        猜你喜欢
        • 2020-09-23
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 2015-10-15
        • 1970-01-01
        • 2013-12-16
        • 1970-01-01
        • 2018-02-16
        相关资源
        最近更新 更多