如何将列按功能应用于矩阵列表

mat*_*t_k 3 r apply

我如何将列中的函数应用于矩阵列表?例如,我有一个如下所示的列表.

[[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" 
Run Code Online (Sandbox Code Playgroud)

这很好用:

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>
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何将它应用到列表中.单独使用lapply不起作用,因为它将函数应用于整个矩阵.我试图使用apply和lapply的组合,但无法理解.

csg*_*pie 6

要获得更好的答案,您需要提供可重现的示例.要获得问题的一般答案,可以使用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>
Run Code Online (Sandbox Code Playgroud)

或使用rapply功能:

#Gives the same as above
R> rapply(L, function(i) apply(i, 2, sum), how="replace")
Run Code Online (Sandbox Code Playgroud)