2016-06-13 37 views
5

Il mio problema è fondamentalmente questo:Dato un elemento di una lista, come faccio a recuperare il suo indice all'interno della lista?

Ho una lista, L, dove ogni elemento è una matrice della stessa dimensione. Ho bisogno di moltiplicare ogni matrice all'interno di questa lista per il suo elemento corrispondente in un vettore esterno h, e quindi sommare tutte le matrici.

set.seed(101) 
L <- replicate(3,matrix(rnorm(4),2),simplify=FALSE) 
h <- 2:4 

# I need this 
L[[1]]*h[1] + L[[2]]*h[2] +L[[3]]*h[3] 

Dato che ho bisogno di sperimentare un diverso numero di matrici, e ho un gruppo di loro, ho avuto modo di farlo in modo intelligente. La mia idea era

L1 <- lapply(L, function(x) x*h[x]) 
L2 <- Reduce('+', L1) 

Dove "h [x]" sarebbe l'indicizzazione del vettore h dall'indice della matrice x all'interno della lista L, quindi vorrei ottenere

L1 = list(L[[1]]*h[1], L[[2]]*h[2], L[[3]]*h[3]) 

Quindi, la domanda è, come posso ottenere l'indice di un elemento in una lista usando l'elemento stesso? Qualcosa come h [L [[m1]]] per ottenere h [1].

Oppure, se hai qualche altro modo di risolvere il mio problema, come posso farlo?

+1

È possibile completare l'esempio fornendo esempi di matrici m1, m2, m3? – Frank

+0

l'esempio dato da Ben Bolker sotto funziona –

risposta

6

Penso che tu sia alla ricerca di mapply()/Map() (Map è leggermente più facile qui perché non cerca di semplificare i risultati):

?Map:

'Map' applica una funzione agli elementi corrispondenti di determinati vettori ... 'Mappa' è un semplice wrapper per 'mapply' che non tenta di semplificare il risultato ...

?mapply:

'mapply' applica 'FUN' ai primi elementi di ogni ... argomento, i secondi elementi, il terzo elementi, e così via

Montato esempio:

set.seed(101) 
L <- replicate(3,matrix(rnorm(4),2),simplify=FALSE) 
h <- 2:4 

do it:

Reduce("+",Map("*",L,h)) 
2

Usando il pacchetto foreach, si può ottenere il risultato come segue:

library(foreach) 
foreach(i=seq_along(h), .combine="+") %do% { 
    L[[i]] * h[i] 
} 

Il ciclo %do% attraversa eseguendo la moltiplicazione elemento-saggio, allora l'uscita sintetizzato utilizzando l'argomento .combine. Questo produce lo stesso risultato del metodo di Ben Map - Reduce.