2010-02-17 12 views

Respuesta

56

Como Oscar Wilde dijo

La consistencia es el último refugio de la imaginación.

R es más un lenguaje evolucionado en lugar de diseñado, por lo que estas cosas suceden. names() y colnames() a trabajar en un data.frame pero names() no funciona en una matriz:

R> DF <- data.frame(foo=1:3, bar=LETTERS[1:3]) 
R> names(DF) 
[1] "foo" "bar" 
R> colnames(DF) 
[1] "foo" "bar" 
R> M <- matrix(1:9, ncol=3, dimnames=list(1:3, c("alpha","beta","gamma"))) 
R> names(M) 
NULL 
R> colnames(M) 
[1] "alpha" "beta" "gamma" 
R> 
+0

Gracias por la respuesta con un ejemplo. Entonces, ¿significa que siempre es conveniente usar 'colnames()' en lugar de 'names()'? ¿Hay una situación similar para los nombres de fila? –

+2

Existen diferencias entre los tipos de datos. – Jay

+5

Emerson dijo: "Una consistencia tonta es el duende de las mentes pequeñas, adorado por pequeños estadistas y filósofos y teólogos. Con consistencia, una gran alma simplemente no tiene nada que hacer". –

8

Sólo para ampliar un poco en el ejemplo de Dirk:

Ayuda a pensar en una trama de datos como una lista con la misma longitud vectores. Esa es probablemente la razón por la cual names funciona con un marco de datos pero no una matriz.

La otra función útil es dimnames que devuelve los nombres para cada dimensión. Notará que la función rownames realmente solo devuelve el primer elemento de dimnames.

En cuanto rownames y row.names: No puedo decir la diferencia, aunque rownames utiliza dimnames mientras row.names fue escrito fuera de R. Ambos parecen también para trabajar con altos dimensionales:

>a <- array(1:5, 1:4) 
> a[1,,,] 
> rownames(a) <- "a" 
> row.names(a) 
[1] "a" 
> a 
, , 1, 1  
    [,1] [,2] 
a 1 2 

> dimnames(a) 
[[1]] 
[1] "a" 

[[2]] 
NULL 

[[3]] 
NULL 

[[4]] 
NULL 
+1

Esta es una mejor respuesta. Snark es divertido, pero el conocimiento es más útil. un 'data.frame' de hecho se puede utilizar como una lista de columnas y una matriz, es decir, cada columna tiene la misma longitud y puede extraer filas individuales o subconjuntos de filas. –

5

creo que usar colnames y rownames tiene más sentido; este es el por qué.

El uso de names tiene varias desventajas. Debe recordar que significa "nombres de columna", y solo funciona con el marco de datos, por lo que deberá llamar al colnames cada vez que utilice matrices. Si llama al colnames, solo tiene que recordar una función. Finalmente, si nos fijamos en el código para colnames, verá que llama a names en el caso de un marco de datos de todos modos, por lo que la salida es idéntica.

rownames y row.names devuelven los mismos valores para matrices de datos y matrices; la única diferencia que he detectado es que donde no haya ningún nombre, rownames imprimirá "NULO" (al igual que colnames), pero row.names lo devuelve de forma invisible. Dado que no hay mucho para elegir entre las dos funciones, rownames gana por razones estéticas, ya que combina más bellamente con colnames. (Además, para el programador perezoso, guarda un carácter de mecanografía.)

2

Y otra expansión:

# create dummy matrix 
set.seed(10) 
m <- matrix(round(runif(25, 1, 5)), 5) 
d <- as.data.frame(m) 

Si desea asignar nombres de las columnas nuevas se puede hacer después de data.frame:

# an identical effect can be achieved with colnames() 
names(d) <- LETTERS[1:5] 
> d 
    A B C D E 
1 3 2 4 3 4 
2 2 2 3 1 3 
3 3 2 1 2 4 
4 4 3 3 3 2 
5 1 3 2 4 3 

Si, sin embargo, ejecuta el comando anterior en matrix, que' desordenar todo:

names(m) <- LETTERS[1:5] 
> m 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 3 2 4 3 4 
[2,] 2 2 3 1 3 
[3,] 3 2 1 2 4 
[4,] 4 3 3 3 2 
[5,] 1 3 2 4 3 
attr(,"names") 
[1] "A" "B" "C" "D" "E" NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
[20] NA NA NA NA NA NA 

Dado que la matriz puede b Considerado como vector bidimensional, asignará nombres solo a los primeros cinco valores (no quiere hacer eso, ¿verdad?). En este caso, debe quedarse con colnames().

Así que no ...

Cuestiones relacionadas