2011-09-30 6 views
2

행렬 목록에 함수를 적용하는 방법은 무엇입니까? 예를 들어 아래 목록이 있습니다.행렬 함수를 행렬 목록에 적용하는 방법

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> 

하지만 목록에 적용하는 방법을 알아낼 수 없습니다 :

[[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" 

이 잘 작동합니다. lapply만으로는 전체 매트릭스에 기능을 적용하기 때문에 작동하지 않습니다. 나는 적용과 복장의 조합을 사용하려고 노력하고 있었지만 그것을 이해할 수 없었다.

답변

5

더 나은 대답을 얻으려면 재현 가능한 예제를 제공해야합니다. 문제에 대한 일반적인 대답을 보려면 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를 사용하면 작동합니다. 감사. –

0

단순한 목록이 아니기 때문에 문제는 lapply가 해결하지 못합니다. 첫 번째 요소에는 두 개의 목록이 있으며 각 목록의 첫 번째 요소는 행렬입니다. 두 번째 요소는 단지 행렬입니다. rapply 함수가 있습니다. 목록과 함수의 현명한 테스트 케이스를 제공하는 경우 사용할 수 있습니다.