¿Debo usar un data.frame o una matrix?

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

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

¿Hay alguna regla general para cuándo usar qué tipo de datos?

Parte de la respuesta ya está contenida en su pregunta: usted usa 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 matriz de elección / 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:

Las matrices son más eficientes en 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 planea hacer operaciones de tipo álgebra lineal.

Los marcos de datos son más convenientes si con frecuencia se refiere 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) información tabular ya que puede aplicar el formato a cada columna por separado.

Algo no mencionado por @Michal es que no solo es una matriz más pequeña que el dataframe 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 a menudo son 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 una ttwig de datos en una matriz, tenga en cuenta que hay una función data.matrix() , que maneja los factores de manera apropiada al convertirlos en valores numéricos basados ​​en los niveles internos. La as.matrix() mediante as.matrix() dará como resultado una matriz de caracteres si cualquiera de las tags de factores no es numérica. Comparar:

 > 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 

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

@Michal: las matrices no son realmente más eficientes en 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 una gran cantidad de columnas:

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

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.

Las matrices y los marcos de datos son matrices 2D rectangulares y pueden ser heterogéneas 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 
    Intereting Posts