Dataframes
## Objetivos de Aprendizaje
- Crear y manipular dataframes
- Seleccionar filas y columnas
- Comprender factores y fechas
- Dominar operaciones con dataframes
- Manejar datos faltantes
## Crear Dataframes
### Creación Básica
```r
# Desde vectores
df <- data.frame(
nombre = c("Alicia", "Roberto", "Carlos"),
edad = c(25, 30, 35),
puntuacion = c(95.5, 87.3, 92.1)
)
# Imprimir dataframe
print(df)
df
```
### con stringsAsFactors
```r
# Por defecto: carácter convertido a factor
df <- data.frame(
nombre = c("Alicia", "Roberto"),
edad = c(25, 30)
)
str(df)
# $ nombre: Factor w/ 2 "Alicia" "Roberto"
# $ edad : num 25 30
# Prevenir conversión
df <- data.frame(
nombre = c("Alicia", "Roberto"),
edad = c(25, 30),
stringsAsFactors = FALSE
)
str(df)
# $ nombre: chr "Alicia" "Roberto"
```
### Desde Matriz
```r
mat <- matrix(1:9, nrow = 3)
df <- as.data.frame(mat)
colnames(df) <- c("A", "B", "C")
```
## Ver Dataframes
### Funciones de Inspección
```r
df <- data.frame(
nombre = c("Alicia", "Roberto", "Carlos"),
edad = c(25, 30, 35)
)
# Estructura
str(df)
# 'data.frame': 3 obs. de 2 variables:
# $ nombre: chr "Alicia" "Roberto" "Carlos"
# $ edad : num 25 30 35
# Dimensiones
nrow(df) # 3
ncol(df) # 2
dim(df) # 3 2
# Nombres de columnas
colnames(df) # "nombre" "edad"
names(df) # Igual
# Primeras/últimas filas
head(df) # Primeras 6 filas
head(df, 3) # Primeras 3 filas
tail(df) # Últimas 6 filas
```
## Selección
### Selección de Filas
```r
df <- data.frame(
nombre = c("Alicia", "Roberto", "Carlos", "Diana"),
edad = c(25, 30, 35, 28),
puntuacion = c(95.5, 87.3, 92.1, 88.7)
)
# Por número de fila
df[1, ] # Primera fila
df[1:2, ] # Primeras dos filas
# Por condición
df[df$edad > 28, ]
# Con subset()
subset(df, edad > 28)
```
### Selección de Columnas
```r
df <- data.frame(
nombre = c("Alicia", "Roberto"),
edad = c(25, 30),
puntuacion = c(95.5, 87.3)
)
# Por nombre
df$nombre # Retorna vector
df[, "nombre"] # Retorna vector
df[, "nombre", drop = FALSE] # Retorna dataframe
# Por posición
df[, 1] # Primera columna como vector
df[, 1:2] # Primeras dos columnas
# Con select
df[, c("nombre", "edad")]
```
### Fila y Columna
```r
df <- data.frame(
nombre = c("Alicia", "Roberto", "Carlos"),
edad = c(25, 30, 35)
)
# Celda única
df[1, 2] # Por posición: 25
df$edad[1] # Vía columna: 25
df[1, "edad"] # Por nombre: 25
```
### Usando dplyr
```r
library(dplyr)
df <- data.frame(
nombre = c("Alicia", "Roberto", "Carlos"),
edad = c(25, 30, 35)
)
# Seleccionar columnas
select(df, nombre)
select(df, nombre, edad)
# Filtrar filas
filter(df, edad > 28)
# Encadenar operaciones
df %>%
filter(edad > 25) %>%
select(nombre)
```
## Agregar/Eliminar Columnas
### Agregar Columna
```r
df <- data.frame(
nombre = c("Alicia", "Roberto"),
edad = c(25, 30)
)
# Asignación directa
df$puntuacion <- c(95.5, 87.3)
# Usando transform
df <- transform(df, puntuacion = c(95.5, 87.3))
# Usando cbind
df <- cbind(df, puntuacion = c(95.5, 87.3))
```
### Eliminar Columna
```r
df <- data.frame(
nombre = c("Alicia", "Roberto"),
edad = c(25, 30),
puntuacion = c(95.5, 87.3)
)
# Asignar NULL
df$puntuacion <- NULL
# Usando subset
df <- subset(df, select = -puntuacion)
# Usando dplyr
df <- select(df, -puntuacion)
```
## Agregar/Eliminar Filas
### Agregar Fila
```r
df <- data.frame(
nombre = c("Alicia", "Roberto"),
edad = c(25, 30)
)
nueva_fila <- data.frame(
nombre = "Carlos",
edad = 35
)
df <- rbind(df, nueva_fila)
```
### Eliminar Fila
```r
df <- data.frame(
nombre = c("Alicia", "Roberto", "Carlos"),
edad = c(25, 30, 35)
)
# Eliminar segunda fila
df <- df[-2, ]
# Eliminar por condición
df <- df[df$nombre != "Roberto", ]
```
## Ordenar
### Order
```r
df <- data.frame(
nombre = c("Carlos", "Alicia", "Roberto"),
edad = c(35, 25, 30)
)
# Ordenar por columna
df[order(df$edad), ]
# Orden descendente
df[order(df$edad, decreasing = TRUE), ]
# Múltiples columnas
df[order(df$edad, df$nombre), ]
```
### Ordenar con dplyr
```r
library(dplyr)
df <- data.frame(
nombre = c("Carlos", "Alicia", "Roberto"),
edad = c(35, 25, 30)
)
df %>% arrange(edad)
df %>% arrange(desc(edad))
df %>% arrange(edad, nombre)
```
## Combinar
### rbind y cbind
```r
# Combinar filas (mismas columnas)
df1 <- data.frame(nombre = "Alicia", edad = 25)
df2 <- data.frame(nombre = "Roberto", edad = 30)
rbind(df1, df2)
# Combinar columnas (mismas filas)
df1 <- data.frame(nombre = c("Alicia", "Roberto"))
df2 <- data.frame(edad = c(25, 30))
cbind(df1, df2)
```
### merge (Unir)
```r
df1 <- data.frame(
id = c(1, 2, 3),
nombre = c("Alicia", "Roberto", "Carlos")
)
df2 <- data.frame(
id = c(2, 3, 4),
puntuacion = c(87.3, 92.1, 88.7)
)
# Unión interna (IDs coincidentes)
merge(df1, df2, by = "id")
# Unión izquierda (todo de df1)
merge(df1, df2, by = "id", all.x = TRUE)
# Unión externa (todo)
merge(df1, df2, by = "id", all = TRUE)
```
## Datos Faltantes
### Verificar NA
```r
df <- data.frame(
nombre = c("Alicia", "Roberto", NA),
edad = c(25, NA, 35)
)
# Encontrar celdas NA
is.na(df)
# nombre edad
# [1,] FALSE FALSE
# [2,] FALSE TRUE
# [3,] TRUE FALSE
# Contar NA por columna
colSums(is.na(df))
# ¿Algún NA?
anyNA(df) # TRUE
```
### Manejar NA
```r
df <- data.frame(
x = c(1, 2, NA, 4),
y = c(NA, 2, 3, 4)
)
# Eliminar filas con cualquier NA
na.omit(df)
# Eliminar filas con NA en columna específica
df[!is.na(df$x), ]
# Llenar NA con valor
df$x[is.na(df$x)] <- 0
# Llenar NA con media
df$x[is.na(df$x)] <- mean(df$x, na.rm = TRUE)
```
### Casos Completos
```r
# Obtener solo casos completos
df <- data.frame(
x = c(1, 2, NA),
y = c(1, NA, 3)
)
complete.cases(df) # TRUE FALSE FALSE
df[complete.cases(df), ] # Solo primera fila
```
## Resumir
### Resumen Básico
```r
df <- data.frame(
nombre = c("Alicia", "Roberto", "Carlos"),
edad = c(25, 30, 35),
puntuacion = c(95.5, 87.3, 92.1)
)
# Estadísticas resumidas
summary(df)
# Funciones específicas
mean(df$edad)
sd(df$puntuacion)
min(df$edad)
max(df$edad)
range(df$edad)
```
### Resumir con dplyr
```r
library(dplyr)
df <- data.frame(
grupo = c("A", "A", "B", "B"),
valor = c(10, 20, 30, 40)
)
# Agrupar y resumir
df %>%
group_by(grupo) %>%
summarize(
media = mean(valor),
suma = sum(valor),
n = n()
)
```
## Factores
### Crear Factores
```r
# Crear factor
genero <- factor(c("hombre", "mujer", "hombre", "mujer"))
levels(genero) # "mujer" "hombre"
as.numeric(genero) # 2 1 2 1
# Con niveles especificados
tamano <- factor(c("pequeño", "grande", "mediano"),
levels = c("pequeño", "mediano", "grande"))
```
### Factores Ordenados
```r
educacion <- ordered(c("secundaria", "doctorado", "licenciatura", "secundaria"),
levels = c("secundaria", "licenciatura", "maestría", "doctorado"))
educacion[2] < educacion[4] # TRUE
```
## Fechas
### Clase Date
```r
# Fecha actual
hoy <- Sys.Date()
class(hoy) # "Date"
# Crear fecha
as.Date("2024-01-15")
as.Date("2024/01/15")
# Desde componentes
as.Date(paste(2024, 1, 15, sep = "-"))
```
### Operaciones con Fechas
```r
# Aritmética de fechas
as.Date("2024-01-15") + 7 # 2024-01-22
as.Date("2024-01-15") - as.Date("2024-01-10") # 5 días
# Extraer partes
fecha <- as.Date("2024-01-15")
format(fecha, "%Y") # "2024"
format(fecha, "%m") # "01"
format(fecha, "%d") # "15"
format(fecha, "%B") # "Enero"
format(fecha, "%a") # "Lun"
```
### POSIXlt/POSIXct
```r
# Hora actual
ahora <- Sys.time()
class(ahora) # "POSIXct" "POSIXt"
# Desde cadena
as.POSIXct("2024-01-15 10:30:00")
# Extraer componentes
ahora_ct <- as.POSIXlt(ahora)
ahora_ct$hour
ahora_ct$min
ahora_ct$sec
```
## Resumen
- Dataframes son estructuras de datos tabulares (filas x columnas)
- Usar `data.frame()` para crear, `str()` para inspeccionar
- Seleccionar con `[fila, col]`, `$columna`, o `subset()`
- Agregar columnas con `$` o `cbind`, filas con `rbind`
- Usar `merge()` para unir dataframes por columnas clave
- Manejar valores faltantes con `is.na()`, `na.omit()`, `complete.cases()`
- Factores para datos categóricos, `levels()` para ver categorías
- Fechas almacenadas como clase `Date` o `POSIXct`
- El paquete `dplyr` proporciona manipulación moderna de dataframes
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →