创建符合条件的分组数据中具有功能的样本

时间:2019-07-11 07:02:08

标签: r

我要创建的样本是每组细胞的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中选择它。

1 个答案:

答案 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