首页 > 解决方案 > 循环遍历R中列表中的唯一元素对

问题描述

假设我有一个名为bb. 我想挑选每对独特的元素并在某种函数(称为)中bb使用它们,如下所示:convolve

## Below `bb` elements: `bma1` & `bma2` are used in the function:

con  <- convolve(dens1= bb$bma1$dposterior,
                 dens2= function(x){bb$bma2$dposterior(-x)},
                  cdf1= bb$bma1$pposterior,
                  cdf2= function(x){1 - bb$bma2$pposterior(-x)})

con$quantile(c(0.025, 0.975))

问题: bb可以有任意数量的元素,但convolve()一次只接受两个元素,我想知道如何遍历bb列表的元素,以便输入所有唯一对bb(在本例中:bma1& bma2; bma1& bma3; bma2 & bma3convolve()

这是一个可重现的代码:

library("metafor")
library("bayesmeta")

dat <- escalc(measure="OR", ai=lh.le, bi=lh.re, ci=rh.le, 
              di=rh.re, data=dat.bourassa1996, add=1/2, to="all")

bma1 <- bayesmeta(dat[dat$sex=="combined",])
bma2 <- bayesmeta(dat[dat$sex=="male",])
bma3 <- bayesmeta(dat[dat$sex=="female",])

bb <- list(bma1 = bma1, bma2 = bma2, bma3 = bma3)

# The function (`source` if needed for full reproducibility)

source('https://raw.githubusercontent.com/rnorouzian/m/master/co.r')

con <- convolve(dens1= bb$bma1$dposterior,
                dens2= function(x){bb$bma2$dposterior(-x)},
                 cdf1= bb$bma1$pposterior,
                 cdf2= function(x){1 - bb$bma2$pposterior(-x)})

con$quantile(c(0.025, 0.975))

标签: rfunctionloopsfor-looppurrr

解决方案


如果bb表示必须成对组合的数据帧,我们可以使用gtools::combinations()它来生成对矩阵并使用它来驱动对convolve().

library("metafor")
library("bayesmeta")

dat <- escalc(measure="OR", ai=lh.le, bi=lh.re, ci=rh.le, 
              di=rh.re, data=dat.bourassa1996, add=1/2, to="all")

bma1 <- bayesmeta(dat[dat$sex=="combined",])
bma2 <- bayesmeta(dat[dat$sex=="male",])
bma3 <- bayesmeta(dat[dat$sex=="female",])

bb <- list(bma1 = bma1, bma2 = bma2, bma3 = bma3)

library(gtools)
comboMatrix <- combinations(length(bb),2) # unique pairs of elements in bb
comboMatrix

此时,comboMatrix看起来像:

> comboMatrix
     [,1] [,2]
[1,]    1    2
[2,]    1    3
[3,]    2    3

我们继续使用原始帖子中提供的代码,将convolve()函数包装在lapply(). 我们lapply()使用一个表示 的行维度的向量来驱动comboMatrix,我们将使用该向量来索引列表中元素对的第 1 列和第 2 列,以便bb在两组之间进行比较。

我们使用[[提取运算符的形式而不是$形式,因为我们需要使用变量替换(即comboMatrix[a,1]or的结果comboMatrix[a,2])从列表中提取适当的元素bb

# The function (source if needed for full reproducibility)

source('https://raw.githubusercontent.com/rnorouzian/m/master/co.r')

conList <- lapply(1:nrow(comboMatrix),function(a){
 con <-    convolve(dens1 = bb[[comboMatrix[a,1]]]$dposterior,
              dens2 = function(x){bb[[comboMatrix[a,2]]]$dposterior(-x)},
              cdf1 = bb[[comboMatrix[a,1]]]$pposterior,
              cdf2 = function(x){1 - bb[[comboMatrix[a,2]]]$pposterior(-x)})
 con$quantile(c(0.025, 0.975))
})

此时,conList对象包含与 相比的每对数据帧的置信区间convolve()

# name the output items
names(conList) <- unlist(lapply(1:nrow(comboMatrix),function(x){
     paste("group",comboMatrix[x,1],"vs",comboMatrix[x,2])
}))

conList

当我们打印对象时,我们会看到三组置信区间:

> conList
$`group 1 vs 2`
[1] -0.3564418  0.3685752

$`group 1 vs 3`
[1] -0.6560065  0.3069931

$`group 2 vs 3`
[1] -0.7298583  0.3589061

当我们通过运行原始帖子中包含的第一个比较代码来验证结果时,我们看到置信区间匹配。

con <- convolve(dens1= bb$bma1$dposterior,
                dens2= function(x){bb$bma2$dposterior(-x)},
                 cdf1= bb$bma1$pposterior,
                 cdf2= function(x){1 - bb$bma2$pposterior(-x)})

con$quantile(c(0.025, 0.975))

...和输出:

> con$quantile(c(0.025, 0.975))
[1] -0.3564418  0.3685752

第二次和第三次运行lapply()也会生成与版本结果相匹配的置信区间。

# group 1 vs. 3
con <- convolve(dens1= bb$bma1$dposterior,
                dens2= function(x){bb$bma3$dposterior(-x)},
                cdf1= bb$bma1$pposterior,
                cdf2= function(x){1 - bb$bma3$pposterior(-x)})

con$quantile(c(0.025, 0.975))


# group 2 vs. 3 
con <- convolve(dens1= bb$bma2$dposterior,
                dens2= function(x){bb$bma3$dposterior(-x)},
                cdf1= bb$bma2$pposterior,
                cdf2= function(x){1 - bb$bma3$pposterior(-x)})

con$quantile(c(0.025, 0.975))

...和输出:

> # group 1 vs. 3
> con <- convolve(dens1= bb$bma1$dposterior,
+                 dens2= function(x){bb$bma3$dposterior(-x)},
+                 cdf1= bb$bma1$pposterior,
+                 cdf2= function(x){1 - bb$bma3$pposterior(-x)})
> 
> con$quantile(c(0.025, 0.975))
[1] -0.6560065  0.3069931
> # group 2 vs. 3 
> con <- convolve(dens1= bb$bma2$dposterior,
+                 dens2= function(x){bb$bma3$dposterior(-x)},
+                 cdf1= bb$bma2$pposterior,
+                 cdf2= function(x){1 - bb$bma3$pposterior(-x)})
> 
> con$quantile(c(0.025, 0.975))
[1] -0.7298583  0.3589061

推荐阅读