定义案例的R(分层)随机抽样

时间:2018-03-04 18:11:45

标签: r random sampling

我有一个数据框

DF <- data.frame(Value = c("AB", "BC", "CD", "DE", "EF", "FG", "GH", "HI", "IJ", "JK", "KL", "LM"),
                 ID    = c(1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1))

我的问题:我想创建一个新列,其中包含(二进制)随机数(&#39; 0&#39;或者&#39; 1&#39;)用于固定比例(或预先确定的患病率)的病例 'ID' == 1(例如,随机数&#39; 0&#39; x 2和&#39; 1&#39; x 4)。

编辑I: 出于非特定情况的目的,解决方案可能是:

DF$RANDOM[sample(1:nrow(DF), nrow(DF), FALSE)] <- rep(RANDOM, c(nrow(DF)-4,4))

但是,我仍然需要特定于cas的分配,并且前面提到的解决方案没有明确地引用&#39; 0&#39;或&#39; 1&#39;。

(注意:变量&#39; value&#39;与问题无关;只有标识符。)

我在stratified samplingrandom row selection上找到相关帖子 - 但这些(和其他)帖子未涵盖此问题。

非常感谢你。

2 个答案:

答案 0 :(得分:1)

您可以先按案例ID == 1对数据进行子集化。为确保出现1和0,我们使用rep函数并在replace函数中将sample设置为False。
这是一个解决方案。

library(data.table)
set.seed(121)
DF[ID == 1, new_column := sample(rep(c(0,1), c(2,4)), .N, replace = F)]
print(DF1)

     Value ID new_column
 1:    AB  1          1
 2:    BC  0         NA
 3:    CD  0         NA
 4:    DE  1          1
 5:    EF  0         NA
 6:    FG  1          1
 7:    GH  1          1
 8:    HI  0         NA
 9:    IJ  0         NA
10:    JK  1          0
11:    KL  0         NA
12:    LM  1          0

答案 1 :(得分:0)

library(dplyr)
DF <- data.frame(Value = c("AB", "BC", "CD", "DE", "EF", "FG", "GH", 
                           "HI", "IJ", "JK", "KL", "LM"),
                 ID = c(1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1), 
                 stringsAsFactors = FALSE)
DF %>% group_by(ID) %>% sample_n(4, replace = FALSE)