#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, которую можно использовать, если вы предоставите разумный тестовый пример списка и функции.