是否有人能够就我在应用函数中可能做错的事情提出建议,我在下面尝试进行配对比较。我已经创建了一个新函数,并且能够使用[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
编辑
如果2
和1
的值通过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