2. Data frames (iris)

1 Data frames esenciales con iris

Objetivo: dominar el acceso por filas/columnas, entender la diferencia entre vector vs data frame al extraer, y practicar nombres y el operador $.

Tip

iris viene en R por defecto. Tiene 150 filas, 5 columnas: 4 numéricas (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) y 1 categórica (Species).

1.1 Primer vistazo: dimensiones, nombres y tipos

Code
iris           # imprime el objeto
Code
nrow(iris); ncol(iris)
[1] 150
[1] 5
Code
names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
Code
str(iris)      # estructura (tipos por columna)
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Code
head(iris, 3)  # primeras 3 filas
Code
tail(iris, 3)  # últimas 3 filas
Code
# Abre visor en IDE (descomenta si usas RStudio/Posit):
# View(iris)
Note

str() es tu amiga: te muestra tipo de dato por columna y ejemplos de valores.

1.2 Indexación por posición: [fila, columna]

Code
iris[1, 2]     # fila 1, columna 2 (valor escalar)
[1] 3.5
Code
iris[1, ]      # fila 1 completa (data frame con 5 columnas)
Code
iris[ , 5]     # columna 5 como VECTOR (por defecto)
  [1] setosa     setosa     setosa     setosa     setosa     setosa    
  [7] setosa     setosa     setosa     setosa     setosa     setosa    
 [13] setosa     setosa     setosa     setosa     setosa     setosa    
 [19] setosa     setosa     setosa     setosa     setosa     setosa    
 [25] setosa     setosa     setosa     setosa     setosa     setosa    
 [31] setosa     setosa     setosa     setosa     setosa     setosa    
 [37] setosa     setosa     setosa     setosa     setosa     setosa    
 [43] setosa     setosa     setosa     setosa     setosa     setosa    
 [49] setosa     setosa     versicolor versicolor versicolor versicolor
 [55] versicolor versicolor versicolor versicolor versicolor versicolor
 [61] versicolor versicolor versicolor versicolor versicolor versicolor
 [67] versicolor versicolor versicolor versicolor versicolor versicolor
 [73] versicolor versicolor versicolor versicolor versicolor versicolor
 [79] versicolor versicolor versicolor versicolor versicolor versicolor
 [85] versicolor versicolor versicolor versicolor versicolor versicolor
 [91] versicolor versicolor versicolor versicolor versicolor versicolor
 [97] versicolor versicolor versicolor versicolor virginica  virginica 
[103] virginica  virginica  virginica  virginica  virginica  virginica 
[109] virginica  virginica  virginica  virginica  virginica  virginica 
[115] virginica  virginica  virginica  virginica  virginica  virginica 
[121] virginica  virginica  virginica  virginica  virginica  virginica 
[127] virginica  virginica  virginica  virginica  virginica  virginica 
[133] virginica  virginica  virginica  virginica  virginica  virginica 
[139] virginica  virginica  virginica  virginica  virginica  virginica 
[145] virginica  virginica  virginica  virginica  virginica  virginica 
Levels: setosa versicolor virginica
Code
iris[ , 5, drop = FALSE]  # columna 5 como DATA FRAME (mantén forma)
Warning

Pitfall común: iris[, 5] devuelve un vector; si necesitas un data frame, usa drop = FALSE o iris[“Species”].

1.3 Indexación por nombre de columna

Code
# Data frame con 1 columna (por nombre):
iris["Species"]
Code
# Vector de nombres para seleccionar varias:
iris[ , c("Sepal.Length", "Sepal.Width")]
Code
# Nombres de columnas:
names(iris)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"     
Code
# Acceso con $ (útil y legible):
iris$Species
  [1] setosa     setosa     setosa     setosa     setosa     setosa    
  [7] setosa     setosa     setosa     setosa     setosa     setosa    
 [13] setosa     setosa     setosa     setosa     setosa     setosa    
 [19] setosa     setosa     setosa     setosa     setosa     setosa    
 [25] setosa     setosa     setosa     setosa     setosa     setosa    
 [31] setosa     setosa     setosa     setosa     setosa     setosa    
 [37] setosa     setosa     setosa     setosa     setosa     setosa    
 [43] setosa     setosa     setosa     setosa     setosa     setosa    
 [49] setosa     setosa     versicolor versicolor versicolor versicolor
 [55] versicolor versicolor versicolor versicolor versicolor versicolor
 [61] versicolor versicolor versicolor versicolor versicolor versicolor
 [67] versicolor versicolor versicolor versicolor versicolor versicolor
 [73] versicolor versicolor versicolor versicolor versicolor versicolor
 [79] versicolor versicolor versicolor versicolor versicolor versicolor
 [85] versicolor versicolor versicolor versicolor versicolor versicolor
 [91] versicolor versicolor versicolor versicolor versicolor versicolor
 [97] versicolor versicolor versicolor versicolor virginica  virginica 
[103] virginica  virginica  virginica  virginica  virginica  virginica 
[109] virginica  virginica  virginica  virginica  virginica  virginica 
[115] virginica  virginica  virginica  virginica  virginica  virginica 
[121] virginica  virginica  virginica  virginica  virginica  virginica 
[127] virginica  virginica  virginica  virginica  virginica  virginica 
[133] virginica  virginica  virginica  virginica  virginica  virginica 
[139] virginica  virginica  virginica  virginica  virginica  virginica 
[145] virginica  virginica  virginica  virginica  virginica  virginica 
Levels: setosa versicolor virginica
Code
mean(iris$Sepal.Length)
[1] 5.843333

1.4 Filtros por condición (base R)

Code
# Filas donde Sepal.Length > 6
largas <- iris[ iris$Sepal.Length > 6, ]
head(largas)
Code
# Filas de la especie "setosa"
setosa <- iris[ iris$Species == "setosa", ]
head(setosa)
Code
# Varias condiciones: AND (&) / OR (|)
ej <- iris[ iris$Species != "setosa" & iris$Sepal.Width >= 3, ]
head(ej)

1.5 Crear columnas y conservar clases

Code
# Crear una razón (ancho/largo del sépalo)
base2 <- iris
base2$ratio_sepal <- base2$Sepal.Width / base2$Sepal.Length

# Chequea tipos y primeras filas
str(base2)
'data.frame':   150 obs. of  6 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ ratio_sepal : num  0.686 0.612 0.681 0.674 0.72 ...
Code
head(base2[, c("Sepal.Length","Sepal.Width","ratio_sepal")])

1.6 Extra: seleccionar filas/columnas con índices y secuencias

Code
# Primeras 10 filas y columnas 1:3
iris[1:10, 1:3]
Code
# Columnas no contiguas por índice
iris[ , c(1, 3, 5)]
Code
# Conjunto complementario (todas menos la 5)
iris[ , -5]

1.7 Ejercicios

  1. Extrae como data frame (no vector) únicamente la columna Petal.Width de iris.
  2. Crea un objeto versicolor_largas con filas de iris donde Species == "versicolor" y Sepal.Length > 6.
  3. Agrega a una copia de iris la columna area_petal = Petal.Length * Petal.Width y calcula su media.
  4. Con otra base: usando mtcars (incluida en R), selecciona en un solo comando las filas 1:5 y 28:32 y las columnas mpg, hp, gear. Guarda el resultado en sub_mtcars.
Code
# Sugerencias de solución (puedes ocultar en clase si prefieres):

# 1) Data frame con Petal.Width (iris)
pw_df <- iris["Petal.Width"]                      # o iris[, "Petal.Width", drop = FALSE]
str(pw_df)
'data.frame':   150 obs. of  1 variable:
 $ Petal.Width: num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
Code
# 2) versicolor con sépalos largos (iris)
versicolor_largas <- iris[ iris$Species == "versicolor" & iris$Sepal.Length > 6, ]
nrow(versicolor_largas); head(versicolor_largas, 3)
[1] 20
Code
# 3) área del pétalo (iris)
iris2 <- iris
iris2$area_petal <- iris2$Petal.Length * iris2$Petal.Width
mean(iris2$area_petal)
[1] 5.794067
Code
# 4) selección por filas y columnas en mtcars
# mtcars viene en R base (32 filas, todas numéricas)
sub_mtcars <- mtcars[c(1:5, 28:32), c("mpg", "hp", "gear")]
sub_mtcars