2016-04-09 24 views
-1

ı listelerin bir matris var diyelim:R: listelerinin matrisin her bir elemanı fonksiyonu uygulamak ve aynı matris formatında sonucu döndüren

theList <- matrix(list(rnorm(10), rnorm(10), rnorm(10), rnorm(10)), nrow=2, ncol=2) 
theList 
    [,1]  [,2] 
[1,] Numeric,10 Numeric,10 
[2,] Numeric,10 Numeric,10 

Ve her öğesi için bazı işlevi uygulamak istediğiniz Orijinal boyutları korurken bu matris. o lapply çalışmaz Ancak

apply(theList, 2, sapply, mean) 
      [,1]  [,2] 
[1,] 0.5678905 0.0577225 
[2,] -0.2708252 0.5045110 

:

apply(theList, 2, lapply, mean) 
[[1]] 
[[1]][[1]] 
[1] 0.5678905 

[[1]][[2]] 
[1] -0.2708252 


[[2]] 
[[2]][[1]] 
[1] 0.0577225 

[[2]][[2]] 
[1] 0.504511 

listeleri ve getiri matrisinde her listesine bir işlev nasıl uygulanır

Ben sapply ile aşağıdaki eserlerini bulundu Aynı formattaki veriler - aynı boyutlara sahip listelerin matrisi?

+1

listelerinin bir matris korkunç bir veri yapısıdır. Ayrıca, neden sapık() iyi çalıştı eğer lapply() 'ile ilgileniyorsun? –

+0

Bu işe yararsa benim için yeterince güzel bir yapı olurdu. Ben 'sapply' istemiyorum, çünkü çıktı olarak tek bir değer döndüren işlevlerle sınırlıdır. “lapply” daha genel ve tutarlıdır. –

+1

Sanırım basitleştiririm: (Uygula (List, 2, lapply, mean)). Ya da <'dim <- \' (lapply (TheList, mean), dim (theList)) ' –

cevap

1

sadece nesnenin üzerine dim özniteliği ayarlar çünkü, bir vektör veya liste dışında bir matris yeniden pahalı değildir. Bu yüzden bu yapacağını:

res <- matrix(lapply(theList,mean),nrow(theList)); 
res; 
##  [,1]  [,2] 
## [1,] -0.1956084 0.03062223 
## [2,] -0.2106935 0.1842444 

Not aynen çiftlerde matrisi gibi yukarıdaki sonuç görüntüler rağmen, listelerin aslında bir matris hala olduğunu:

str(res); 
## List of 4 
## $ : num -0.196 
## $ : num -0.211 
## $ : num 0.0306 
## $ : num 0.184 
## - attr(*, "dim")= int [1:2] 2 2 
+0

Teşekkürler + 1. Sonuçta akıldan matris yapmak için benzer bir yaklaşım vardı. Ama "daha zarif" bir çözüm arıyordu. Şimdilik, 'plyr''''nın' llply'' işi iyi iş yapıyor gibi görünüyor. Ama temel R'de verdiğiniz cevap şu ana kadarki en iyisi. –

0

plyr bu yaklaşım gibi görünüyor çalışıyor:

Bu konuda, haritalama fonksiyonu için purrr işlevin birçok sizinki gibi durumlarda vardır ne
library(plyr) 
llply(theList, range) 
     [,1]  [,2] 
[1,] Numeric,2 Numeric,2 
[2,] Numeric,2 Numeric,2 
0

,

library(purrr) 
apply(theList, 2, map_dbl, mean)