← R EspañolChapter 06 of 13

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 →