Я недавно внедренная некоторые рекурсивные функции полезности для этого. Однако они не проверяют предварительные условия (равную длину, суммируемость элементов).
EDIT: Я исправил проблемы, упомянутые в комментариях. Для петель заменяются функциями высокого порядка, и функция имеет лучшее поведение ошибки. Функция также обрабатывает более сложные структуры списка, например. списки, содержащие другие списки, содержащие числовые элементы. Это больше (и сложнее), чем то, о чем попросил ОП, но я подумал, что стоит хранить его на случай, если кому-то понадобится рекурсивное решение.
sum_numeric_lists <- function(...){
lists <- list(...)
if (length(unique(sapply(lists, length))) > 1) {
stop("lists are not of equal length")
}
Map(function(...) {
elems <- list(...)
if (length(unique(sapply(elems, class))) > 1) {
stop("corresponding elements have different types")
}
if (is.list(elems[[1]])) {
sum_numeric_lists(...)
} else if(is.numeric(elems[[1]])){
Reduce(`+`, elems)
} else {
warning("lists contain types other than numeric, which are preserved as NULL elements")
NULL
}
}, ...)
}
devide_numeric_list_by <- function(l, divisor){
lapply(X = l, FUN = function(elem) {
if (is.list(elem)) {
devide_numeric_list_by(elem, divisor)
} else if(is.numeric(elem)){
elem/divisor
} else {
warning("lists contain types other than numeric, which are preserved as NULL elements")
NULL
}
})
}
avg_numeric_lists <- function(...){
sum_l <- sum_numeric_lists(...)
devide_numeric_list_by(sum_l, length(list(...)))
}
Некоторые тесты:
avg_numeric_lists()
avg_numeric_lists(NULL)
avg_numeric_lists(list())
avg_numeric_lists(list(NULL))
avg_numeric_lists(list(1))
avg_numeric_lists(list(list(1)))
list1 <- list(m_first_lvl = matrix(sample(1:10, 20, replace = T), nrow=4, ncol=5),list(m_sec_lvl = matrix(sample(1:10, 6, replace = T), nrow=3, ncol=2)),"not_a_list_or_numeric",a_number = 1)
list2 <- list(m_first_lvl = matrix(sample(1:10, 20, replace = T), nrow=4, ncol=5),list(m_sec_lvl = matrix(sample(1:10, 6, replace = T), nrow=3, ncol=2)),"not_a_list_or_numeric",a_number = 2)
list3 <- list(m_first_lvl = matrix(sample(1:10, 20, replace = T), nrow=4, ncol=5),list(m_sec_lvl = matrix(sample(1:10, 6, replace = T), nrow=3, ncol=2)),"not_a_list_or_numeric",a_number = 3)
avg_numeric_lists(list1, list2, list3)
Для вызова его на всех списков в глобальной среде (как это было предложено Rawr):
do.call(what = avg_numeric_lists, args = mget(ls(pattern = '^list\\d+$')))
Положение каждой матрицы одинакова в каждом списке, так что я хочу, чтобы добавить каждую матрицу в одной и той же матрицы – user3742038
ли списки с вашими реальными результатами также отдельные переменные, такие как '' list1', list2', .. .? Или они хранятся в каком-то другом списке? – Julius
хранятся в отдельных файлах Rdata. – user3742038