Применяйте функцию R к одному набору данных несколько раз, но каждый раз меняйте значение одного аргумента

#r #list #lapply

#r #Список #lapply

Вопрос:

Я хочу написать / применить функцию, которая повторяет LD2 функцию из pegas пакета в наборе данных (jaguar), но каждый раз изменяет значение аргумента ‘locus’. Аргумент ‘locus’ принимает вектор длиной два (например, c(1,2), c (2,3), c(77,78) и т.д.).

Например, я хочу, чтобы код выполнялся loci.pairs[[1]] , затем loci.pairs[[2]] loci.pairs[[3]] и т.д. и выводил результаты в виде списка.

Я пытался сделать это с помощью lapply циклов for и while, но столкнулся с ошибками (см. Ниже):

Загружайте библиотеки и данные

 library(adegenet)
library(pegas)
data("jaguar")
  

Создайте список пар локусов

 loci.pairs = combn(seq(1,ncol(jaguar)-1), 2, simplify = FALSE)
loci.pairs[[1]]
  

Сравните каждую пару местоположений из списка loci.pairs

 LD2(jaguar, locus=c(1,2), details=FALSE)
LD2(jaguar, locus=loci.pairs[[1]], details=FALSE)
LD2(jaguar, locus=loci.pairs[[2]], details=FALSE)
LD2(jaguar, locus=loci.pairs[[3]], details=FALSE)
LD2(jaguar, locus=loci.pairs[[4]], details=FALSE)
LD2(jaguar, locus=loci.pairs[[78]], details=FALSE)
  

ошибка (lapply)

 lapply(jaguar, function(x) LD2(jaguar, locus=loci.pairs[[x]], details=FALSE))
  

Ошибка в loci.pairs[[x]] : сбой рекурсивной индексации на уровне 2

Комментарии:

1. возможно, вы могли бы попробовать sapply(1:number_of_pairs,function(x) LD2(jaguar,locus=loci.pairs[[x]],details=FALSE

Ответ №1:

lapply функция имеет другой синтаксис. Попробуйте это:

 lapply(loci.pairs, function(x) LD2(jaguar, locus=x, details=FALSE))
  

Первый аргумент lapply содержит список, по которому вы хотите выполнить итерацию.
Поскольку вы хотите повторить комбинации, которые вы должны использовать lapply(loci.pairs...) вместо lapply(jaguar,...) .

По сути, этот вызов lapply (с точки зрения вывода) эквивалентен следующему циклу:

 result_list = list()
for (i in 1:n) {
   result_list[[i]] <-  LD2(jaguar, locus=loci.pairs[[i]], details=FALSE)
}