sostituire Come si usa `[` correttamente con(l | s) si applica per selezionare una colonna specifica da un elenco di matrici?




logaritmo naturale in r (3)

Si consideri la seguente situazione in cui ho una lista di n matrici (questo è solo dati fittizi nell'esempio sotto) nell'oggetto myList

mat <- matrix(1:12, ncol = 3)
myList <- list(mat1 = mat, mat2 = mat, mat3 = mat, mat4 = mat)

Voglio selezionare una colonna specifica da ciascuna delle matrici e fare qualcosa con esso. Questo mi porterà la prima colonna di ciascuna matrice e la restituirò come una matrice ( lapply() mi darà una lista che va bene).

sapply(myList, function(x) x[, 1])

Quello che non riesco a fare è usare [ direttamente come una funzione nei miei sapply() o lapply() . ?'[' mi dice che devo fornire l'argomento j come identificatore di colonna. Quindi cosa sto sbagliando che non funziona?

> lapply(myList, `[`, j = 1)
$mat1
[1] 1

$mat2
[1] 1

$mat3
[1] 1

$mat4
[1] 1

Dove mi aspetterei questo:

$mat1
[1] 1 2 3 4

$mat2
[1] 1 2 3 4

$mat3
[1] 1 2 3 4

$mat4
[1] 1 2 3 4

Sospetto che mi stia sbagliando [ metodo, ma non riesco a capire perché? Pensieri?


Answer #1

Dopo due pinte della migliore birra inglese e un po 'di cogitazione, mi rendo conto che questa versione funzionerà:

lapply(myList, `[`, , 1)

cioè non nominare nulla e trattarlo come se avessi fatto mat[ ,1] . Ancora non capisco perché la denominazione di j non funziona ...

... in realtà, dopo aver letto ?'[' più da vicino, noto la seguente sezione:

Argument matching:

     Note that these operations do not match their index arguments in
     the standard way: argument names are ignored and positional
     matching only is used.  So ‘m[j=2,i=1]’ is equivalent to ‘m[2,1]’
     and *not* to ‘m[1,2]’.

E questo spiega il mio dilemma sopra. Sì per aver effettivamente letto la documentazione.


Answer #2

Penso che tu stia ottenendo la forma di argomento 1 di [ . Se fai lapply(myList, `[`, i =, j = 1) funziona.


Answer #3

È perché [ è una funzione .Primitive . Non ha argomenti. E non esiste un metodo [.matrix .

> `[`
.Primitive("[")
> args(`[`)
NULL
> methods(`[`)
 [1] [.acf*            [.AsIs            [.bibentry*       [.data.frame     
 [5] [.Date            [.difftime        [.factor          [.formula*       
 [9] [.getAnywhere*    [.hexmode         [.listof          [.noquote        
[13] [.numeric_version [.octmode         [.person*         [.POSIXct        
[17] [.POSIXlt         [.raster*         [.roman*          [.SavedPlots*    
[21] [.simple.list     [.terms*          [.ts*             [.tskernel* 

Anche se questo in realtà pone solo la domanda su come [ viene inviato su oggetti matrix ...





r