2011-03-01 29 views
129

¿Cuándo se debe usar un data.frame, y cuándo es mejor usar un matrix?¿Debo usar un data.frame o una matriz?

Ambos mantienen los datos en un formato rectangular, por lo que a veces no está claro.

¿Existen reglas generales para cuándo usar qué tipo de datos?

+0

A menudo, una matriz puede ser más adecuado para un determinado tipo de datos, pero si el paquete que desea utilizar para analizar dicha matriz espera una trama de datos, siempre tendrá a convertirlo innecesariamente. Creo que no hay forma de evitar recordar qué paquete lo usa. – xApple

Respuesta

160

Parte de la respuesta ya está incluida en su pregunta: Usted utiliza marcos de datos si se puede esperar que las columnas (variables) sean de diferentes tipos (numéricas/de caracteres/lógicas, etc.). Las matrices son para datos del mismo tipo.

En consecuencia, la opción matrix/data.frame solo es problemática si tiene datos del mismo tipo.

La respuesta depende de lo que va a hacer con los datos en data.frame/matrix. Si se va a pasar a otras funciones, entonces el tipo esperado de los argumentos de estas funciones determina la elección.

también:

matrices son más eficiente de la memoria:

m = matrix(1:4, 2, 2) 
d = as.data.frame(m) 
object.size(m) 
# 216 bytes 
object.size(d) 
# 792 bytes 

Las matrices son una necesidad si va a hacer ningún tipo de álgebra lineal de operaciones.

Los marcos de datos son más convenientes si con frecuencia hace referencia a sus columnas por su nombre (a través del operador compacto $).

Los marcos de datos también son en mi humilde opinión mejores para informar (imprimir) la información tabular, ya que puede aplicar el formato a cada columna por separado.

+2

Una cosa que agregaría a esta respuesta es que si planea usar el paquete ggplot2 para hacer gráficos, ggplot2 solo funciona con data.frames y no con matrices. ¡Solo algo de lo que debes estar al tanto! – Bajcz

65

Algo no mencionado por @Michal es que no solo es una matriz más pequeña que el marco de datos equivalente, el uso de matrices puede hacer que su código sea mucho más eficiente que usar marcos de datos, a menudo considerablemente. Esa es una de las razones por las cuales internamente, muchas funciones R forzarán a las matrices de datos que están en marcos de datos.

Los marcos de datos son a menudo mucho más convenientes; uno no siempre tiene solo trozos atómicos de datos desperdigados.

Tenga en cuenta que puede tener una matriz de caracteres; no solo tiene que tener datos numéricos para construir una matriz en R.

Al convertir un marco de datos en una matriz, tenga en cuenta que existe una función data.matrix(), que maneja los factores de manera apropiada convirtiéndola a valores numéricos basados ​​en los niveles internos. La coerción a través de as.matrix() dará como resultado una matriz de caracteres si cualquiera de las etiquetas de factores no es numérica. Compare:

> head(as.matrix(data.frame(a = factor(letters), B = factor(LETTERS)))) 
    a B 
[1,] "a" "A" 
[2,] "b" "B" 
[3,] "c" "C" 
[4,] "d" "D" 
[5,] "e" "E" 
[6,] "f" "F" 
> head(data.matrix(data.frame(a = factor(letters), B = factor(LETTERS)))) 
    a B 
[1,] 1 1 
[2,] 2 2 
[3,] 3 3 
[4,] 4 4 
[5,] 5 5 
[6,] 6 6 

que casi siempre utilizar una trama de datos para mis tareas de análisis de datos, que a menudo tienen más de las variables numéricas solo. Cuando codigo las funciones para los paquetes, casi siempre hago coerción a la matriz y luego formateo los resultados como un marco de datos. Esto se debe a que los marcos de datos son convenientes.

+6

+1 bueno saber sobre 'data.matrix' –

+0

Me he estado preguntando la diferencia entre data.matrix() y as.matrix(), también. Gracias por aclararlos y sus consejos en la programación. – microbe

+0

Gracias por compartir @Gavin Simpson! ¿Podría presentarnos un poco más sobre cómo volver del 1-6 al a-f? –

9

La matriz es en realidad un vector con métodos adicionales. mientras que data.frame es una lista. La diferencia está en el vector vs list. para la eficiencia de cálculo, quédate con la matriz. Usando data.frame si es necesario.

+3

Hmm, ¿una matriz es un vector con dimensiones, no veo dónde entran los métodos? –

43

@Michal: Las matrices no son realmente más eficiente de la memoria:

m <- matrix(1:400000, 200000, 2) 
d <- data.frame(m) 
object.size(m) 
# 1600200 bytes 
object.size(d) 
# 1600776 bytes 

... a menos que tenga un gran número de columnas:

m <- matrix(1:400000, 2, 200000) 
d <- data.frame(m) 
object.size(m) 
# 1600200 bytes 
object.size(d) 
# 22400568 bytes 
+0

el argumento de la eficiencia de memoria es realmente acerca de 'data.frames' que ofrece más flexibilidad sobre los tipos de columna. 'data.frame (a = rnorm (1e6), b = sample (letters, 1e6, TRUE))' será mucho más pequeño (6x según mi cálculo rápido) en la memoria que la versión 'matrix' debido a la coerción de tipo. – MichaelChirico

0

Matrices y tramas de datos son rectangulares Matrices 2D y puede ser heterogéneo por filas y columnas. Comparten algunos métodos y propiedades , pero no todos.

Ejemplos:

M <- list(3.14,TRUE,5L,c(2,3,5),"dog",1i) # a list 
dim(M) <- c(2,3)       # set dimensions 
print(M)         # print result 

#  [,1] [,2]  [,3] 
# [1,] 3.14 5   "dog" 
# [2,] TRUE Numeric,3 0+1i 

DF <- data.frame(M)     # a data frame 
print(DF)        # print result 

#  X1  X2 X3 
# 1 3.14  5 dog 
# 2 TRUE 2, 3, 5 0+1i 

M <- matrix(c(1,1,1,1,2,3,1,3,6),3) # a numeric matrix 
DF <- data.frame(M)     # a all numeric data frame 

solve(M)        # obtains inverse matrix 
solve(DF)        # obtains inverse matrix 
det(M)        # obtains determinant 
det(DF)        # error 
Cuestiones relacionadas