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

时间:2011-09-30 16:05:04

标签: 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" 

这很好用:

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的组合,但无法弄明白。

2 个答案:

答案 0 :(得分: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>

或使用rapply功能:

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

答案 1 :(得分:1)

你的问题不是由lapply简单解决,因为它不是一个简单的列表。第一个元素有两个列表,每个列表的第一个元素是矩阵。第二个元素只是一个矩阵。有一个rapply函数,如果你提供一个合理的列表和函数测试用例,可以使用它。