2010-10-29 5 views
27

considere la siguiente situación donde tengo una lista de n matrices (esto es sólo datos ficticios en el ejemplo a continuación) en el objeto myList¿Cómo se usa `[` correctamente con (l | s) aplicar para seleccionar una columna específica de una lista de matrices?

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

deseo seleccionar una columna específica de cada una de las matrices y hacer algo con eso. Esto me dará la primera columna de cada matriz y la devolveré como una matriz (lapply() me daría una lista, o bien está bien).

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

Lo que no parecen ser capaces de hacer es usar [ directamente como una función en mis sapply() o lapply() encantamientos. ?'[' me dice que necesito proporcionar el argumento j como el identificador de columna. Entonces, ¿qué estoy haciendo mal que esto no funciona?

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

$mat2 
[1] 1 

$mat3 
[1] 1 

$mat4 
[1] 1 

Cuando yo esperaría esto:

$mat1 
[1] 1 2 3 4 

$mat2 
[1] 1 2 3 4 

$mat3 
[1] 1 2 3 4 

$mat4 
[1] 1 2 3 4 

sospecho que estoy recibiendo el [ método equivocado, pero no puedo entender por qué? ¿Pensamientos?

Respuesta

20

creo que está recibiendo el formulario 1 argumento de [. Si lo haces lapply(myList, `[`, i =, j = 1), funciona.

+1

+1 ¡Bravo! Muy bien hecho. –

+0

+1 Así que esto funciona: lapply (myList, '[', i =, j = 1) – Shane

+2

Tomó un tiempo para descubrir cómo escapar de los palos de atrás dentro del código en línea. Use `foo`. Ver http://meta.stackexchange.com/questions/12694/escaping-backticks-fails –

4

Es porque es una función [.Primitive. No tiene argumento j. Y no hay un método [.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* 

Aunque esto realmente sólo plantea la cuestión de cómo [ está siendo despachados en los objetos de la matriz ...

11

Después de dos pintas de cerveza más fina de Gran Bretaña y un poco de reflexión, que se dan cuenta de que esta versión funcionará:

lapply(myList, `[`, , 1) 

es decir, no nombra nada y lo tratan como si hubiera hecho mat[ ,1]. Todavía no grep por qué nombrar j no funciona ...

... en realidad, después de haber leído ?'[' más de cerca, noto la siguiente sección:

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]’. 

Y eso explica mi dilema anterior. Sí, por leer la documentación.

+3

Estoy bastante seguro de que la razón es que '[' es un método primitivo y por lo tanto ignora los nombres de los argumentos. – hadley

+3

'lapply (myList,' [', TRUE, 1)' también funciona. ;) –

Cuestiones relacionadas