假设我在下面的data.frame中,treat == 1
表示id
得到了处理,而prob
是treat == 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
为了最小化选择偏差,我现在希望基于
treat
和prob
的值创建伪处理和控制组:treat == 1
的任何id在任何具有prob
的id
的0.1 treat == 0
范围内时,我希望对group
的值进行“处理”。 treat == 0
的任何id在任何具有prob
的id
的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/