применить функцию к элементам списка - PullRequest
4 голосов
/ 17 августа 2011

Извините за простой вопрос, но я не могу придумать хороший способ взять элементы функций из списка фреймов данных. Я уверен, что в пакетах plyr / reshape2 есть что-то, но я просто не могу об этом думать.

Например, у меня есть список А следующим образом:

>A
[[1]]
        [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
   [1,]    1    1    1    1    1    1    1    1    1     1
   [2,]    1    1    1    1    1    1    1    1    1     1
   [3,]    1    1    1    1    1    1    1    1    1     1
   [4,]    1    1    1    1    1    1    1    1    1     1
   [5,]    1    1    1    1    1    1    1    1    1     1

[[2]]
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    2    2    2    2    2    2    2    2    2     2
 [2,]    2    2    2    2    2    2    2    2    2     2
 [3,]    2    2    2    2    2    2    2    2    2     2
 [4,]    2    2    2    2    2    2    2    2    2     2
 [5,]    2    2    2    2    2    2    2    2    2     2

Скажем, я хочу взять среднее значение для соответствующих элементов матриц в списке. Один из способов сделать это будет

Reduce("+",A)/length(A)

Я не могу передать Reduce() более сложные функции и предположить, что в целом есть лучший способ.

Ответы [ 2 ]

6 голосов
/ 17 августа 2011

В этом случае, может быть, вам лучше использовать данные в array, а не в списке?

#Recreate data
A <- list(a=matrix(1,5,10),b=matrix(2,5,10))

#Convert to array
A1 <- array(do.call(cbind,A),dim = c(5,10,2))

#Better way to convert to array
require(abind)
A1 <- abind(A,along = 3)

#Now we can simply use apply
apply(A1,c(1,2),mean)
2 голосов
/ 17 августа 2011

Может быть do.call?

do.call(`+`, A)/length(A)

Или, если вы действительно не хотите abind превратить его в большую матрицу,

array(sapply(seq_along(A[[1]]), function(i) mean(sapply(A,`[`,i))), 
      dim=dim(A[[1]]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...