r语言 - 使用apply函数进行对比较



是否有人能够就我在应用函数中可能做错的事情提出建议,我在下面尝试进行配对比较。我已经创建了一个新函数,并且能够使用[1]将第一个案例与第一个控件进行比较。但现在我需要使用apply函数来比较所有9对可能的组合。我试着使用下面的应用程序,但它不起作用。预期的输出应该是一个包含结果的向量,例如基于函数的1、-1和0。所以当我将第一种情况与第一种对照进行比较时,结果是-1。所以现在我要比较每一对可能的配对,最终得到9个结果,而不是1个,因为有9对可能的配对匹配干预1和2 -结果应该是:1,0,1,0,-1,0,0,-1,0,-1,0提前感谢。

## simulate data
data <- data.frame(
id = c(1, 5, 6, 11, 15, 21),
intervention = c(2, 2, 2, 1, 1, 1),
mortality_30d = c(0, 1, 0, 1, 0, 0)
)
## create new function to compare the outcome and determine result
newfunction <- function (outcome_case, outcome_control){

if (outcome_case < outcome_control) {result = 1}
if (outcome_case > outcome_control) {result = -1}
if (outcome_case == outcome_control) {result = 0}

return(result)

}
# compare the 1st case and 1st control in terms of mortality
newfunction(data[which(data$intervention == 1)[1], 'mortality_30d'], 
data[which(data$intervention == 2)[1], 'mortality_30d'])
## use an apply function to compare all 9 possible pairs 
test<-sapply(data$id,function(x) {
newfunction(data[which(data$intervention == 1),'mortality_30d'], 
(data[which(data$intervention == 2),'mortality_30d']))
})

outer函数将返回一个双向操作结果的矩阵,您可以设置它以给出差的符号。也许:

outer( data1[1:3, 3],  # appears you want to compare outcomes between interventions
data1[4:6, 3],  # second intervention mortality
FUN=function(x,y){ sign(x-y) })
#-------------
[,1] [,2] [,3]
[1,]   -1    0    0
[2,]    0    1    1
[3,]   -1    0    0

可以用嵌套的sapply-s来做,但那将非常笨拙。

使用你的函数(做些小改动)

new_fun <- function (outcome_case, outcome_control){

if (outcome_case < outcome_control) { 
return(1)
} else if (outcome_case > outcome_control) {
return(-1)
} else {
return(0)
}
}

我们可以在索引数组上使用apply

expand.grid(1:3, 4:6)

给了我们

Var1 Var2
1    1    4
2    2    4
3    3    4
4    1    5
5    2    5
6    3    5
7    1    6
8    2    6
9    3    6

这些是所有可能对的索引。使用apply:

apply(expand.grid(1:3, 4:6), 1, function(x) new_fun(data[x[1], 3], data[x[2], 3]))

返回
#> [1]  1  0  1  0 -1  0  0 -1  0

编辑

如果21的值通过intervention随机分布,这种方法将不起作用。但是我们可以通过使用which来获得索引并将它们与expand.grid:

一起使用
data_2 <- data.frame(
id = c(1, 5, 6, 11, 15, 21),
intervention = c(1, 2, 2, 1, 2, 1), # new intervention column
mortality_30d = c(0, 1, 0, 1, 0, 0)
)

apply(expand.grid(which(data_2$intervention == 2), which(data_2$intervention == 1)), 
1, 
function(x) sign(data_2[x[2], 3] - data_2[x[1], 3]))

这返回

#> [1] -1  0  0  0  1  1 -1  0  0

相关内容

  • 没有找到相关文章

最新更新