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