【问题标题】:How to create sub set of data with equal random distribution in R如何在R中创建具有相等随机分布的数据子集
【发布时间】:2021-07-09 09:35:36
【问题描述】:

我在 R 中有以下提到的数据框:

ID      Unique_Id      Date                  Status
I-1     UR-112         2020-01-01 14:15:16   Approved
I-2     UR-112         2020-02-12 14:15:16   In Process
I-3     UR-112         2020-03-23 14:15:16   In Process
I-4     UR-113         2020-01-01 14:15:16   Hold
I-5     UR-113         2020-04-11 14:15:16   Hold
I-6     UR-114         2020-04-07 14:15:16   Approved
I-7     UR-114         2020-05-08 14:15:16   Approved
I-8     UR-114         2020-05-09 14:15:16   In Process
I-9     UR-115         2020-01-18 14:15:16   Approved
I-10    UR-115         2020-03-23 14:15:16   Approved
I-11    UR-116         2020-02-11 14:15:16   Approved

我需要创建一个随机 3 Unique_Id 的子集,它分布在所有 Date 中,这三个 Unique_Id 必须属于可用的 Status

需要的输出

ID      Unique_Id      Date                  Status
I-1     UR-112         2020-01-01 14:15:16   Approved
I-2     UR-112         2020-02-12 14:15:16   In Process
I-3     UR-112         2020-03-23 14:15:16   In Process
I-4     UR-113         2020-01-01 14:15:16   Hold
I-5     UR-113         2020-04-11 14:15:16   Hold
I-11    UR-116         2020-02-11 14:15:16   Approved

【问题讨论】:

  • 也许:x[x$x$Unique_Id %in% sample(unique(x$Unique_Id), 3),]
  • @GKi- 谢谢,我已经尝试过了,但它没有涵盖Status 部分。
  • Status应考虑哪些条件?
  • @GKi- 所有可用的唯一值。
  • 如果Status 有三个可能的值,并且您被限制为三个随机的Unique_Ids,并且需要每个可能的状态值至少表示一次,那么唯一可能的选择是为Status 的每个值选择一个Unique_Id。如果Status 的可能值超过三个,则无解。还是我错过了什么?

标签: r dataframe dplyr data.table tidyverse


【解决方案1】:

使用 GKi 的数据,这是另一种选择:

setDT(x)
x[Unique_Id %chin%
    x[sample(.N)][.(unique(Status)), on=.(Status), mult="first", Unique_Id]
]

【讨论】:

    【解决方案2】:

    也许使用如下循环:

    id <- character(0)
    while(length(id) != 3) {
      id <- character(0)
      for(i in unique(x$Status)) {id <-
       c(id, sample(setdiff(x$Unique_Id[x$Status == i], id), 1))}
    }
    
    x[x$Unique_Id %in% id,]
    #     ID Unique_Id                Date     Status
    #4   I-4    UR-113 2020-01-01 14:15:16       Hold
    #5   I-5    UR-113 2020-04-11 14:15:16       Hold
    #6   I-6    UR-114 2020-04-07 14:15:16   Approved
    #7   I-7    UR-114 2020-05-08 14:15:16   Approved
    #8   I-8    UR-114 2020-05-09 14:15:16 In Process
    #9   I-9    UR-115 2020-01-18 14:15:16   Approved
    #10 I-10    UR-115 2020-03-23 14:15:16   Approved
    

    数据:

    x <- structure(list(ID = c("I-1", "I-2", "I-3", "I-4", "I-5", "I-6", 
    "I-7", "I-8", "I-9", "I-10", "I-11"), Unique_Id = c("UR-112", 
    "UR-112", "UR-112", "UR-113", "UR-113", "UR-114", "UR-114", "UR-114", 
    "UR-115", "UR-115", "UR-116"), Date = c("2020-01-01 14:15:16", 
    "2020-02-12 14:15:16", "2020-03-23 14:15:16", "2020-01-01 14:15:16", 
    "2020-04-11 14:15:16", "2020-04-07 14:15:16", "2020-05-08 14:15:16", 
    "2020-05-09 14:15:16", "2020-01-18 14:15:16", "2020-03-23 14:15:16", 
    "2020-02-11 14:15:16"), Status = c("Approved", "In Process", 
    "In Process", "Hold", "Hold", "Approved", "Approved", "In Process", 
    "Approved", "Approved", "Approved")), class = "data.frame", row.names = c(NA, 
    -11L))
    

    【讨论】:

    • 运行 100 万个数据集需要很长时间。
    • 有没有办法让这个过程更快?
    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    相关资源
    最近更新 更多