цикл по двум переменным в списках - PullRequest
0 голосов
/ 24 октября 2019

У меня есть список списков с матрицами расстояний:

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? Спасибо!

1 Ответ

1 голос
/ 25 октября 2019

Если бы я правильно понял ваш вопрос, я бы сделал что-то вроде этого:

for(i in seq_along(obs)) {         # 1st level of obs

    for (j in names(obs[[i]])) {   # 2nd level of obs, 1st level of distances

        res[[i]][[j]] <- mantel(obs[[i]][[j]], distances[[j]], "spearman", perm=999)

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...