如何在R中创建具有相等随机分布的数据子集

如何在R中创建具有相等随机分布的数据子集,r,dataframe,dplyr,data.table,tidyverse,R,Dataframe,Dplyr,Data.table,Tidyverse,我在下面提到了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

我在下面提到了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个唯一Id的子集,它分布在所有
日期
,这三个
唯一Id
必须处于可用的
状态


所需输出可能使用如下循环:

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

id使用GKi的数据,这里是另一个选项:

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

也许:
x[x$x$Unique\u Id%在%sample中(Unique(x$Unique\u Id),3),]
@GKi-谢谢,我尝试过这一点,但它没有涵盖
状态
部分。对于
状态
应该考虑哪些条件?@GKi-所有可用的唯一值。如果有三个可能的
状态
值,并且您被限制为三个随机的
唯一Id
,并且需要至少表示每个可能的状态值一次,唯一可能的选择是为
状态的每个值选择一个
唯一的\u Id
。如果
Status
有三个以上的可能值,则没有解决方案。或者我遗漏了什么?当我在一百万个数据集上运行时,需要花费很多时间。有什么方法可以让这个过程更快吗?
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))
setDT(x)
x[Unique_Id %chin%
    x[sample(.N)][.(unique(Status)), on=.(Status), mult="first", Unique_Id]
]