Как применить функцию по столбцу к списку матриц

Как мне применить функцию по столбцу к списку матриц? Например, у меня есть список, как показано ниже.

[[1]]
[[1]][[1]]
    [,1] [,2] [,3]
[1,] "b"  "c"  "d" 
[2,] "y"  "y"  "y" 
[3,] "z"  "z"  "z" 

[[1]][[2]]
    [,1] [,2] [,3] 
[1,] "b"  "b"  "c" 
[2,] "c"  "d"  "d" 
[3,] "y"  "y"  "y" 
[4,] "z"  "z"  "z" 


[[2]]
    [,1] [,2]
[1,] "y"  "z" 

Это отлично работает:

apply(p[[1]][[1]],2,gen.fmla,y="q")

[[1]]
log(q) ~ b + y + z
<environment: 0x920732c>

[[2]]
log(q) ~ c + y + z
<environment: 0x912e66c>

[[3]]
log(q) ~ d + y + z
<environment: 0x85b608c>

Но я не могу понять, как применить это к списку. Только lapply не работает, поскольку он применяет функцию ко всей матрице. Я пытался использовать комбинацию из apply и lapply, но не мог этого понять.


person matt_k    schedule 30.09.2011    source источник


Ответы (2)


Чтобы получить лучший ответ, вам нужно привести воспроизводимый пример. Для общего ответа на вашу проблему вы можете использовать lapply дважды. Например:

##Create some data
R> l = list()
R> l[[1]] = matrix(rnorm(10), 2); l[[2]] = matrix(rnorm(10), 2)*10
R> L = list()
R> L[[1]] = l; L[[2]] = l
R> f = function(l) lapply(l, apply, 2, sum) 
R> lapply(L, f)
[[1]]
[[1]][[1]]
[1]  1.1923  0.5275  0.4957  0.6848 -0.2776

[[1]][[2]]
[1] -13.984  15.435 -16.362   8.799   4.186

<snip>

Или используя функцию rapply:

#Gives the same as above
R> rapply(L, function(i) apply(i, 2, sum), how="replace")
person csgillespie    schedule 30.09.2011
comment
Я знал, что это что-то вроде этого, но просто не мог этого понять. Использовал rapply и все работает. Спасибо. - person matt_k; 30.09.2011

Ваша проблема не решается просто lapply, поскольку это не простой список. Первый элемент состоит из двух списков, каждый из которых имеет в качестве первого элемента матрицу. Второй элемент - это просто матрица. Существует функция rapply, которую можно использовать, если вы предоставите разумный тестовый пример списка и функции.

person IRTFM    schedule 30.09.2011