【问题标题】:Cycling through two lists for all pairwise combinations循环遍历所有成对组合的两个列表
【发布时间】:2019-08-12 14:13:22
【问题描述】:

有两个列表,包括许多矩阵:

df <- data.frame(replicate(100,sample(0:100,100,rep=TRUE)))
l.i <- vector("list")
l.j <- vector("list")

for (var in names(df[1:50])) {
   l.i[[var]] <- as.matrix(dist(df[var], "euclidean"))
}

for (var in names(df[51:100])) {
  l.j[[var]] <- as.matrix(dist(df[var], "euclidean"))
}

我想计算 l.il.j 中所有成对元素之间的 Mantel 测试(但不在其中)。我可以做例如:

library(vegan)
all.i.vs.j1 <- lapply(l.i, function(x) mantel(x, l.j$X51))
all.i.vs.j2 <- lapply(l.i, function(x) mantel(x, l.j$X52))

这确实是我想要的输出环境,但我想将其包装到 for 循环或 lapply 中。

谢谢!

【问题讨论】:

    标签: r loops lapply


    【解决方案1】:

    我们可以使用Map将函数mantel应用于'l.i'和'l.j'的对应元素

    library(vegan)
    out <- Map(mantel, l.i, l.j)
    length(out)
    #[1] 50
    

    如果我们需要成对,则使用outer

    f1 <- function(x, y) list(mantel(x, y))
    out1 <- outer(l.i, l.j, FUN = Vectorize(f1)) 
    

    【讨论】:

    • 不错。可以调整它以给出两个列表中所有元素的成对组合吗?标题中提到了,但正文中没有明确提及。
    • @nouse。你可以使用outer
    • @nouse 更新了帖子。请检查是否有帮助
    • 很好地使用Vecotirze
    • @nouse out1list 的矩阵。因此您可以提取具有 row.column 索引的元素,即out1[3, 3] 获取第 3 行第 3 列元素。同样out1[3, 3:4] 给出第 3 行的第 3 列和第 4 列元素
    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    相关资源
    最近更新 更多