代码之家  ›  专栏  ›  技术社区  ›  Dan

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

  •  0
  • Dan  · 技术社区  · 6 年前

    我有一个 数据框 :

    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))
    

    我的问题:我想创建一个 新建列 包括(二进制) 随机数 (' 0 '或' 1 ') 对于案例 'ID' == 1 使用 固定比例 (或预定义的患病率)(例如,随机数' 0 'x 2和' 1. 'x 4)。

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

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

    但是,我仍然需要cas特定的分配,并且上述解决方案没有明确提到' 0 '或' 1. '。

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

    我在上找到了相关帖子 stratified sampling random row selection -但这些(和其他)帖子并没有涉及这个问题。

    提前非常感谢您。

    2 回复  |  直到 6 年前
        1
  •  1
  •   YOLO    6 年前

    您可以先按情况将数据子集 ID == 1 。为了确保1和0的出现,我们使用 rep 函数和集合 replace 在中出错 sample 作用
    这里有一个解决方案。

    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
    
        2
  •  0
  •   Yiran Wang    6 年前
    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)