vacio - Nombres de fila y columna en R
seleccionar filas en r (4)
¿Los siguientes pares de funciones generan exactamente los mismos resultados?
Par 1) names()
y colnames()
Par 2) rownames()
y row.names()
Creo que usar colnames
y rownames
tiene más sentido; este es el por qué.
Usar names
tiene varias desventajas. Debes recordar que significa "nombres de columna", y solo funciona con el marco de datos, por lo que tendrás que llamar a los colnames
siempre que uses matrices. Al invocar colnames
, solo debe recordar una función. Finalmente, si observa el código para colnames
, verá que llama names
en el caso de un marco de datos de todos modos, por lo que el resultado es idéntico.
rownames
y row.names
devuelven los mismos valores para marco de datos y matrices; la única diferencia que he detectado es que cuando no hay nombres, rownames
imprimirá "NULL" (como lo hace colnames
), pero row.names
devuelve de manera invisible. Como no hay mucho para elegir entre las dos funciones, rownames
gana por razones estéticas, ya que colnames
más bellamente con colnames
. (Además, para el programador perezoso, guarda un carácter de mecanografía).
Solo para expandir un poco en el ejemplo de Dirk:
Ayuda a pensar en un marco de datos como una lista con vectores de igual longitud. Probablemente sea por eso que los names
funcionan 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ás que la función de rownames
realidad solo devuelve el primer elemento de dimnames
.
En cuanto a rownames
y row.names
: no puedo decir la diferencia, aunque rownames
usa dimnames
mientras row.names
se escribió fuera de R. También parece que ambos funcionan con matrices de mayor dimensión:
>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
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 nuevos nombres de columna, puede hacer lo siguiente en 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 la matrix
, lo arruinará 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 se puede considerar como un vector bidimensional, asignará nombres solo a los primeros cinco valores (no desea hacer eso, ¿verdad?). En este caso, debe seguir con colnames()
.
Por lo tanto, allí...
Como dijo Oscar Wilde
La consistencia es el último refugio de los que no son imaginativos.
R es más un lenguaje evolucionado que diseñado, por lo que estas cosas suceden. names()
y colnames()
funcionan 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>