У меня есть список списков с матрицами расстояний:
obs <- list(AA=list(A=dist(runif(100)),
B=dist(runif(100)),
C=dist(runif(100))),
BB=list(A=dist(runif(100)),
B=dist(runif(100)),
C=dist(runif(100))))
obs <- lapply(obs, function(x)
lapply(x, function(x) as.data.frame(as.matrix(x))))
И еще один с только одной иерархией:
distances <- lapply(list(A=rnorm(100),B=rnorm(100),C=rnorm(100)), function(x)
as.data.frame(as.matrix(dist(x, "euclidean"))))
Я хотел бы сравнить все матрицы в2-й уровень obs
и первый уровень distances
, если их имена совпадают (obs[i]$A
с distances$A
, B с B, C с C; никогда не все комбинации!). После попытки запустить sapply в lapply, которая не удалась, я пришел к циклам, во время которых я сохраняю результаты и извлекаю из них некоторые значения:
coef <- pvals <- res <- vector("list", length(names(obs)))
library(vegan)
for(i in (names(obs)){
res[[i]]$A <- mantel(obs[[i]]$A, distances$A, "spearman", perm=999)
#tmp <- res[[i]]$A
#coef[i]$A <- tmp[i]$statistic
#pvals[i]$A <- tmp[i]$signic
}
Я перебираю первый уровень obs
и исправляювторой уровень, и выполните это для obs[[i]]$A
и B
(не вставляя # строк сверху снова для экономии места):
for(i in (names(obs)){
res[[i]]$B <- mantel(obs[[i]]$B, distances$B, "spearman", perm=999)
...
}
for(i in (names(obs)){
res[[i]]$C <- mantel(obs[[i]]$C, distances$C, "spearman", perm=999)
...
}
Теперь вопрос состоит в том, чтобы перебрать второй уровень (obs[i]$A,B,C)
также указав правильную матрицу в distances
. Было бы лучше поместить три вышеприведенных цикла в один родительский цикл (через obs [i] [j]) или есть способ использовать lapply? Спасибо!