我要创建的样本是每组细胞的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
我需要样本中的数字1是满足EX == 1的那些单元格,但是如果需要完成样本并达到10%,请选择那些满足PL == 1的单元格。因此,在该示例中,ID组1具有一个满足EX == 1的单元,并且未在s1中选择它。
答案 0 :(得分:1)
为处理这种更新的情况,我们创建了一个名为replace_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)
}
然后使用replicate
获得n
列数
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