为多个对象的成对“全部与全部”比较创建循环

时间:2014-09-22 12:25:50

标签: r

我想做成对#34;所有对所有"多个数据帧的组合,在我的情况下与Mantel测试。

我想要比较大约50种不同的矩阵: Obj1,Obj2,Obj3,...,Objn

library(vegan)
mantel(Obj1, Obj2)

我是否可以针对所有组合进行循环,可能省略冗余对?那么,只做n * (n-1)/2的一半?

我正在将结果收集到数据框中:

result <- data.frame(mantel_r = NA, significance = NA)
mant <- mantel(Obj1, Obj2)
result[01, c("mantel_r", "significance")] <- mant[3:4]

是否可以将循环与此基本代码结合使用?可能是根据输入给result.dataframe的行命名?

1 个答案:

答案 0 :(得分:4)

我猜mantel来自vegan

library(vegan)   
names1 <- ls(pattern="Obj")
names1 #I created 3 matrices with names starting with Obj
#[1] "Obj1" "Obj2" "Obj3"

Cmb1 <- combn(names1, 2)
lst1 <- lapply(split(Cmb1, col(Cmb1)), function(x) unlist(mantel(get(x[1]), get(x[2]))[3:4]))

更新

我假设你希望list元素有一些名字。

names(lst1) <- sapply(lst1, function(x) { paste(paste(names(x), x, sep="_"), collapse="_") })

lst1