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

#r #apply

#r #применить

Вопрос:

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

 [[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, но не смог понять это.

Ответ №1:

Чтобы получить лучший ответ, вам необходимо предоставить воспроизводимый пример. Для общего ответа на вашу проблему вы можете использовать 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")
  

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

1. Я знал, что это что-то в этом роде, но просто не мог понять. Использовал rapply, и это работает. Спасибо.

Ответ №2:

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