假设我在下面的data.frame中,treat == 1表示id得到了处理,而probtreat == 1的计算出的概率。

set.seed(1)
df <- data.frame(id = 1:10, treat = sample(0:1, 10, replace = T))
df$prob <- ifelse(df$treat, rnorm(10, .8, .1), rnorm(10, .4, .4))
df
   id treat      prob
1   1     0 0.3820266
2   2     0 0.3935239
3   3     1 0.8738325
4   4     1 0.8575781
5   5     0 0.6375605
6   6     1 0.9511781
7   7     1 0.8389843
8   8     1 0.7378759
9   9     1 0.5785300
10 10     0 0.6479303

为了最小化选择偏差,我现在希望基于treatprob的值创建伪处理和控制组:
  • 当具有treat == 1的任何id在任何具有probid的0.1 treat == 0范围内时,我希望对group的值进行“处理”。
  • 当具有treat == 0的任何id在任何具有probid的0.1 treat == 1范围内时,我希望group的值是“control”。

  • 以下是我希望得到的结果的示例。
    df$group <- c(NA, NA, NA, NA, 'control', NA, NA, 'treated', 'treated', 'control')
    df
       id treat      prob   group
    1   1     0 0.3820266    <NA>
    2   2     0 0.3935239    <NA>
    3   3     1 0.8738325    <NA>
    4   4     1 0.8575781    <NA>
    5   5     0 0.6375605 control
    6   6     1 0.9511781    <NA>
    7   7     1 0.8389843    <NA>
    8   8     1 0.7378759 treated
    9   9     1 0.5785300 treated
    10 10     0 0.6479303 control
    

    我将如何去做呢?在上面的示例中,匹配是通过替换完成的,但是也欢迎不替换的解决方案。

    最佳答案

    我认为此问题非常适合基数R中的cut。这是如何以向量化的方式进行处理的方法:

    f <- function(r) {
          x <- cut(df[r,]$prob, breaks = c(df[!r,]$prob-0.1, df[!r,]$prob+0.1))
          df[r,][!is.na(x),]$id
    }
    
    ones <- df$treat==1
    df$group <- NA
    
    df[df$id %in% f(ones),]$group <- "treated"
    df[df$id %in% f(!ones),]$group <- "control"
    
    > df
    
       # id treat      prob   group
    # 1   1     0 0.3820266    <NA>
    # 2   2     0 0.3935239    <NA>
    # 3   3     1 0.8738325    <NA>
    # 4   4     1 0.8575781    <NA>
    # 5   5     0 0.6375605 control
    # 6   6     1 0.9511781    <NA>
    # 7   7     1 0.8389843    <NA>
    # 8   8     1 0.7378759 treated
    # 9   9     1 0.5785300 treated
    # 10 10     0 0.6479303 control
    

    关于r - 如何在R中进行群组匹配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43520180/

    10-11 12:57