2013-07-23 2 views
2

У меня есть десять огромных списков (каждый список имеет семь элементов, но элементы огромны), и мне нужно вычислить элемент мудрого значения этих списков. Поэтому, если есть списки A1, A2, A3, ..., A10. Мне нужно рассчитать:Элемент мудрый средний из нескольких списков в R

mean1 = mean(A1[[1]], A2[[1]], A3[[1]], ...,A10[[1]]) 
. 
. 
. 
mean7 = mean(A1[[7]], A2[[7]], A3[[7]], ....A10[[7]]) 

Я сделал это с цикл, но я хотел бы знать, если есть лучшее решение, предоставляемое R. Спасибо заранее.

+1

Можете ли вы предоставить образец своего списка? Что такое 'A1 [[1]]' вектор? матрица? –

+1

Я думал, что каждый элемент - это не вектор, а список из семи элементов, каждый из которых является вектором?! –

+0

На самом деле реальные данные слишком велики. Но каждый Ax [[x]] - это кадр данных, который мне нужно вычислить «среднее» из «данных» этих кадров данных. – hora

ответ

3

Если предположить, что ваши A s списки векторов:

Anames <- paste0("A", 1:10) 

# for completeness 
for(A in Anames) 
    assign(A, lapply(1:7, function(x) rnorm(1000))) 

sapply(1:7, function(i) 
{ 
    m <- sapply(Anames, function(A) get(A)[[i]]) 
    mean(m) 
}) 

Это позволяет избежать строительства копии всех ваших A с в памяти, вместо извлечения их по одному и извлекая нужный вектор. Но если у вас достаточно памяти для хранения всех этих данных, вы, вероятно, можете позволить себе также сохранить копию.

+0

Престижность для понимания «проблемы» !!! –

+0

: D Я попросил странным образом? да, у меня достаточно памяти на кластере, я проверяю, работает ли решение или нет, но это требует времени. – hora

+0

Большое спасибо за помощь и понимание проблемы :) – hora

4

Если A[[·]] векторы как следующий список,

> (List <- list(A=1:4, B=5:8, C=9:12)) 
$A 
[1] 1 2 3 4 

$B 
[1] 5 6 7 8 

$C 
[1] 9 10 11 12 

, то вы можете использовать этот подход, чтобы получить среднее значение:

> rowMeans(simplify2array(List)) 
[1] 5 6 7 8 

rowMeans(as.data.frame(List)) даст вам тот же результат.

+0

Да, и похоже на то, что я как раз собирался попробовать: 'A1 <- 1:10; A2 <- 21:20; A3 <- 21:30; rowMeans (do.call (cbind, list (A1, A2, A3))) '... :) – texb

+0

приятное использование функции' simplify2array'. это выглядит как 'matrix (unlist (.., use.names = FALSE), nrow = ..)' под капотом. – Arun

Смежные вопросы