如何按列将功能应用于矩阵列表?例如,我有一个如下所示的列表。
[[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的组合,但无法弄明白。
答案 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函数,如果你提供一个合理的列表和函数测试用例,可以使用它。