Data Frames

Un data frame es una estructura bidimentional puede almacenar datos mixtos. Un data frame es un caso particular de lista. Es una lista de vectores de la misma longitud.

Crear un data frame

Podemos crear un data frame usando la función data.frame().

df <- data.frame(
        muestra = c('Samp01', 'Samp02', 'Samp03', 'Samp04', 'Samp05'),
        ph = c(5.3, 5.8, 5.0, 5.5, 5.3),
        temp = c(18.6, 19.0, 19.2, 18.9, 19.2)
    )
df
muestra ph temp
Samp01 5.3 18.6
Samp02 5.8 19.0
Samp03 5.0 19.2
Samp04 5.5 18.9
Samp05 5.3 19.2

Importar datos

En general no vamos a crear el data frame desde cero, sino que lo crearemos al importar datos desde un fichero (txt, excel, csv, tsv, etc..). Por ejemplo vamos a importar el dataset palmerpenguins desde un archivo csv, usando la función read.csv(), algunas funciones similares son read.table(), read.delim(). El paquete readxl permite extraer datos directamente de archivos xlsx.

df <- read.csv('../data/penguins.csv')

head(df)
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
Adelie Torgersen 39.1 18.7 181 3750 male 2007
Adelie Torgersen 39.5 17.4 186 3800 female 2007
Adelie Torgersen 40.3 18.0 195 3250 female 2007
Adelie Torgersen 36.7 19.3 193 3450 female 2007
Adelie Torgersen 39.3 20.6 190 3650 male 2007
Adelie Torgersen 38.9 17.8 181 3625 female 2007

Estructura de un data frame

str(df)
'data.frame':   333 obs. of  8 variables:
 $ species          : chr  "Adelie" "Adelie" "Adelie" "Adelie" ...
 $ island           : chr  "Torgersen" "Torgersen" "Torgersen" "Torgersen" ...
 $ bill_length_mm   : num  39.1 39.5 40.3 36.7 39.3 38.9 39.2 41.1 38.6 34.6 ...
 $ bill_depth_mm    : num  18.7 17.4 18 19.3 20.6 17.8 19.6 17.6 21.2 21.1 ...
 $ flipper_length_mm: int  181 186 195 193 190 181 195 182 191 198 ...
 $ body_mass_g      : int  3750 3800 3250 3450 3650 3625 4675 3200 3800 4400 ...
 $ sex              : chr  "male" "female" "female" "female" ...
 $ year             : int  2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...

Acceder a los elementos de un data frame

Seleccionar elementos de un data frame funciona de manera similar a seleccionar los elementos de un vector, pero hay que tener en cuenta que el data frame tiene dos dimensiones. En este caso se debe de indicar la fila y la columna ([fila, columna]). Si se deja en blanco alguna posición, indica que se seleccionan todos los valores, es decir df es equivalente a df[ , ].

Seleccionar columnas.

Al seleccionar una columna se tiene como resultado un vector con todos los valores. Hay 3 maneras de seleccionar una columna. Usando la posición, el nombre o usando el método con $.

head(df$bill_length_mm)
[1] 39.1 39.5 40.3 36.7 39.3 38.9
head(df[, 3])
[1] 39.1 39.5 40.3 36.7 39.3 38.9
head(df[, c('bill_length_mm')])
[1] 39.1 39.5 40.3 36.7 39.3 38.9

Seleccionar filas

En general usaremos un vector indice para selecionar las filas. En este caso el resultado es un data frame con las filas seleccionadas.

head(df[100:150,])
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
100 Adelie Biscoe 39.7 18.9 184 3550 male 2009
101 Adelie Biscoe 38.6 17.2 199 3750 female 2009
102 Adelie Biscoe 38.2 20.0 190 3900 male 2009
103 Adelie Biscoe 38.1 17.0 181 3175 female 2009
104 Adelie Biscoe 43.2 19.0 197 4775 male 2009
105 Adelie Biscoe 38.1 16.5 198 3825 female 2009

Seleccionar filas y columnas

head(df[100:150, c('island', 'bill_length_mm', 'bill_depth_mm')])
island bill_length_mm bill_depth_mm
100 Biscoe 39.7 18.9
101 Biscoe 38.6 17.2
102 Biscoe 38.2 20.0
103 Biscoe 38.1 17.0
104 Biscoe 43.2 19.0
105 Biscoe 38.1 16.5

Usar máscaras lógicas.

Al igual que con los vectores se pueden usar máscaras lógicas para filtar los datos. Seleccionar los pinguinos ‘Adelie’ de la isla ‘Torgersen’

head(df[df$species == 'Adelie' & df$island == 'Torgersen', ])
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
Adelie Torgersen 39.1 18.7 181 3750 male 2007
Adelie Torgersen 39.5 17.4 186 3800 female 2007
Adelie Torgersen 40.3 18.0 195 3250 female 2007
Adelie Torgersen 36.7 19.3 193 3450 female 2007
Adelie Torgersen 39.3 20.6 190 3650 male 2007
Adelie Torgersen 38.9 17.8 181 3625 female 2007

Modificar datos de un data frame

Añadir columnas

df$bill_ratio <- df$bill_length_mm / df$bill_depth_mm

head(df[, c('species', 'bill_length_mm', 'bill_depth_mm', 'bill_ratio')])
species bill_length_mm bill_depth_mm bill_ratio
Adelie 39.1 18.7 2.090909
Adelie 39.5 17.4 2.270115
Adelie 40.3 18.0 2.238889
Adelie 36.7 19.3 1.901554
Adelie 39.3 20.6 1.907767
Adelie 38.9 17.8 2.185393

Eliminar columnas

df$bill_ratio <- NULL

head(df)
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
Adelie Torgersen 39.1 18.7 181 3750 male 2007
Adelie Torgersen 39.5 17.4 186 3800 female 2007
Adelie Torgersen 40.3 18.0 195 3250 female 2007
Adelie Torgersen 36.7 19.3 193 3450 female 2007
Adelie Torgersen 39.3 20.6 190 3650 male 2007
Adelie Torgersen 38.9 17.8 181 3625 female 2007