r - 循环遍历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 & bma3
)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)
# 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))
解决方案
如果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
推荐阅读
- c++ - 共享库 C++:未定义的引用
- r - 难以将 geocdoed 地址组合到路线图上
- excel - 如何将单元格值复制到另一个工作表中的文本框
- java - 进程'command'/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/bin/java''完成时出现非零退出值1错误
- reactjs - 在 Electron + Create React App 中使用文件系统访问 API 写入文件失败
- mysql - 在 mySQL C 接口中获取结果集字段类型
- javascript - 是否可以通过 Jest 测试在父级中的自定义子组件上触发 (ngModelChange) 事件?
- python-3.x - 使用 pyinstaller 创建的 MacOs 应用程序的奇怪行为
- python - 如何使用不同的命令在 tkinter 上执行多个按钮?
- c++ - 如何转换字符(或字符串,其他类型)-> 位?