R 在满足条件的分组数据中使用函数创建样本

R 在满足条件的分组数据中使用函数创建样本,r,R,我想创建样本,这些样本占每组单元格的10%,但在这个样本中,应该包括满足EX==1的单元格,并使用满足PL==1的单元格完成样本(如果需要)。我需要重复多次(1000次) 我使用了一个函数来创建示例并将其粘贴到df中。我想,为了得到我想要的东西,floor的参数将会改变 > rep_func <- function() { + x %>% + group_by(ID) %>% + dplyr::mutate(s1 = 0, + s1 = re

我想创建样本,这些样本占每组单元格的10%,但在这个样本中,应该包括满足EX==1的单元格,并使用满足PL==1的单元格完成样本(如果需要)。我需要重复多次(1000次)

我使用了一个函数来创建示例并将其粘贴到df中。我想,为了得到我想要的东西,
floor
的参数将会改变

> rep_func <- function() {
+ x %>%
+   group_by(ID) %>%
+     dplyr::mutate(s1 = 0,
+          s1 = replace(s1, sample(which(PL == 1), floor(0.1 * n())), 1)) %>%
+   pull(s1)
+ }
> n <- 2
> x[paste0("s", seq_len(n))] <- replicate(n, rep_func())
> x
   ID PL EX s1 s2
1   1  0  1  0  0
2   1  1  0  0  0
3   1  0  0  0  0
4   1  1  0  0  0
5   1  0  0  0  0
6   1  1  0  0  0
7   1  0  0  0  0
8   1  1  0  0  0
9   1  0  0  0  0
10  1  1  0  1  1
11  1  0  0  0  0
12  1  1  0  0  1
13  1  0  0  0  0
14  1  1  0  0  0
15  1  0  0  0  0
16  1  1  0  0  0
17  1  0  0  0  0
18  1  1  0  0  0
19  1  0  0  0  0
20  1  1  0  1  0
21  2  0  0  0  0
22  2  1  0  0  0
23  2  0  0  0  0
24  2  1  0  0  0
25  2  0  0  0  0
26  2  1  0  0  0
27  2  0  1  0  0
28  2  1  0  1  1
29  2  0  0  0  0
30  2  1  0  0  0
>rep_func%
+分组依据(ID)%>%
+dplyr::突变(s1=0,
+s1=替换(s1,样本(其中PL==1),地板(0.1*n()),1))%>%
+拉力(s1)
+ }
>n x[粘贴0(“s”,序号(n))]x
ID PL EX s1 s2
1   1  0  1  0  0
2   1  1  0  0  0
3   1  0  0  0  0
4   1  1  0  0  0
5   1  0  0  0  0
6   1  1  0  0  0
7   1  0  0  0  0
8   1  1  0  0  0
9   1  0  0  0  0
10  1  1  0  1  1
11  1  0  0  0  0
12  1  1  0  0  1
13  1  0  0  0  0
14  1  1  0  0  0
15  1  0  0  0  0
16  1  1  0  0  0
17  1  0  0  0  0
18  1  1  0  0  0
19  1  0  0  0  0
20  1  1  0  1  0
21  2  0  0  0  0
22  2  1  0  0  0
23  2  0  0  0  0
24  2  1  0  0  0
25  2  0  0  0  0
26  2  1  0  0  0
27  2  0  1  0  0
28  2  1  0  1  1
29  2  0  0  0  0
30  2  1  0  0  0

我需要样本中的数字1是那些满足EX==1的单元格,但是如果需要完成样本并达到10%,请选择那些满足PL==1的单元格。因此,在示例中,ID组1有一个满足EX==1的单元格,并且在s1中没有选择它。为了处理这个更新的情况,我们创建了一个名为
replace\u func
的新函数,该函数将为每个组调用(
ID
)并将优先填充
EX
值,如果仍有一些值需要填充,则10%的组使用
PL
值填充

library(dplyr)

replace_func <- function(EX, PL) {
    s = integer(length(EX))
    n <- floor(0.1 * length(EX))
    ex1 <- EX == 1
    if (sum(ex1) > n)
       return(replace(s, sample(which(ex1), n), 1))
    else {
       s1 <- replace(s, ex1, 1)
       return(replace(s1, sample(which(PL == 1), n - sum(ex1)), 1))
  }
}

rep_func <- function() {
    x %>%
     group_by(ID) %>%
     mutate(s1 = replace_func(EX, PL)) %>%
     pull(s1)
}

因此,您希望为每个
ID
随机分配10%,如果
PL
EX
1
,则也将其设置为
1
?不完全是这样,我希望EX优先于PL和随机分配10%
n <- 2
x[paste0("s", seq_len(n))] <- replicate(5, rep_func())

x
#   ID PL EX s1 s2
#1   1  0  1  1  1
#2   1  1  0  0  0
#3   1  0  0  0  0
#4   1  1  0  0  0
#5   1  0  0  0  0
#6   1  1  0  0  0
#7   1  0  0  0  0
#8   1  1  0  0  0
#9   1  0  0  0  0
#10  1  1  0  1  0
#11  1  0  0  0  0
#12  1  1  0  0  1
#13  1  0  0  0  0
#14  1  1  0  0  0
#15  1  0  0  0  0
#16  1  1  0  0  0
#17  1  0  0  0  0
#18  1  1  0  0  0
#19  1  0  0  0  0
#20  1  1  0  0  0
#21  2  0  0  0  0
#22  2  1  0  0  0
#23  2  0  0  0  0
#24  2  1  0  0  0
#25  2  0  0  0  0
#26  2  1  0  0  0
#27  2  0  1  1  1
#28  2  1  0  0  0
#29  2  0  0  0  0
#30  2  1  0  0  0