Práctico 0: Nivelación de fundamentos en R

Primeros pasos, estructuras de datos y R Base

Autor/a

Gabriel Sotomayor

Fecha de publicación

09 marzo 2026

Nota🎯 Antes de empezar

Antes de sumergirnos en el análisis de encuestas masivas y paquetes modernos (como veremos en las próximas semanas), necesitamos entender cómo “piensa” y cómo se estructura R por debajo. Este práctico es una nivelación esencial para soltar las manos con la consola, perderle el miedo al código y entender la lógica del programa.

0. Objetivo del práctico

El propósito de este práctico es familiarizarnos con R y RStudio. R es un lenguaje de programación orientado a objetos, especialmente diseñado para el análisis estadístico y la visualización de datos.

RStudio, por otro lado, proporciona un entorno integrado de desarrollo (IDE) que facilita el uso de R, ofreciendo numerosas herramientas útiles en un solo lugar (editor, consola, visor de gráficos y entorno de variables).


1. R como calculadora

R no solo es útil para análisis estadísticos complejos, sino también para operaciones matemáticas básicas. Estas operaciones son la base matemática que luego nos permitirá recodificar o transformar nuestras variables.

A continuación, demostramos cómo usar R como calculadora en la consola. Sitúa tu cursor en el bloque de código y ejecútalo:

5 + 2  # Suma
[1] 7
5 - 2  # Resta
[1] 3
5 / 2  # División
[1] 2.5
5 * 2  # Multiplicación
[1] 10

2. Creación y manipulación de objetos

En R, no solemos trabajar con números sueltos. Lo normal es crear “objetos” para almacenar datos en la memoria temporal de nuestro computador (RAM). A continuación, se muestra cómo asignar un valor a un objeto usando la flecha de asignación <-.

TipAtajo de teclado

Para escribir el símbolo de asignación <- rápidamente, puedes usar el atajo Alt + - (en Windows) u Option + - (en Mac).

x <- 5

Al ejecutar la línea anterior, notarás que en el panel superior derecho (tu Environment o Ambiente de trabajo) apareció el objeto x. Como ya está guardado, podemos imprimirlo o “llamarlo” simplemente escribiendo su nombre:

x
[1] 5

Podemos crear todos los objetos que consideremos necesarios. Esta vez, crearemos un segundo objeto llamado y:

y <- 10

Ahora podemos realizar operaciones directamente con nuestros objetos en lugar de usar los números directamente. ¡Esta es la magia de la programación!

x + y
[1] 15
x - y
[1] -5
x * y
[1] 50
x / y
[1] 0.5

También podemos guardar los resultados de estas nuevas operaciones en objetos completamente nuevos:

z <- x^2  # Elevamos 'x' al cuadrado y lo guardamos en 'z'
z         # Llamamos a 'z' para ver el resultado
[1] 25

3. Operaciones lógicas

Además de la matemática tradicional, R nos permite realizar operaciones lógicas; es decir, evaluar si una afirmación es verdadera (TRUE) o falsa (FALSE).

Para establecer una pregunta de igualdad matemática usamos el doble signo igual == (ya que un solo = se usa a veces para asignar objetos, igual que la flecha <-).

x > y          # ¿Es x mayor que y? (R responderá FALSE)
[1] FALSE
15 == x + y    # ¿Es 15 exactamente igual a x + y? (R responderá TRUE)
[1] TRUE
16 > x + y     # ¿Es 16 mayor que x + y? 
[1] TRUE

4. Vectores: Nuestras variables

Un vector en R es una secuencia de elementos del mismo tipo. Para el lenguaje del software esto es un vector numérico o de texto; para nosotros, los investigadores, esto es una variable.

Nota📝 El ejercicio práctico

Imaginemos que salimos a la calle y aplicamos un pequeño cuestionario a 9 personas. Anotamos sus respuestas en papel y ahora queremos pasarlas a R.

Empecemos creando una variable llamada edad. Mediante la función concatenar c(), podemos crear un objeto que agrupe todas las respuestas de nuestros 9 encuestados. En este caso, será una variable numérica (numeric): intervalar, continua y cuantitativa.

# Ingresamos las 9 edades separadas por comas
edad <- c(18, 25, 33, 38, 67, 25, 35, 57, 99)

summary(edad) # Nos da estadísticas descriptivas rápidas (Mínimo, Media, Máximo, etc.)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  18.00   25.00   35.00   44.11   57.00   99.00 
table(edad)   # Nos da una tabla de frecuencias absolutas
edad
18 25 33 35 38 57 67 99 
 1  2  1  1  1  1  1  1 
class(edad)   # Nos confirma qué tipo de dato es (numeric)
[1] "numeric"

Podemos realizar operaciones matemáticas sobre los vectores. R aplicará la operación a cada uno de los elementos del vector por separado y nos devolverá un vector completo con los resultados individuales.

edad / 2      # Divide la edad de cada encuestado a la mitad
[1]  9.0 12.5 16.5 19.0 33.5 12.5 17.5 28.5 49.5
edad - 1      # Le resta 1 año a cada encuestado
[1] 17 24 32 37 66 24 34 56 98
# Podemos guardar esta alteración en una nueva variable:
edad2 <- edad - 1 

# También podemos realizar operaciones intercaladas.
# Aquí dividirá a la 1ra persona por 1, a la 2da por 2, a la 3ra por 1, etc.
edad / c(1, 2)
Warning in edad/c(1, 2): longer object length is not a multiple of shorter
object length
[1] 18.0 12.5 33.0 19.0 67.0 12.5 35.0 28.5 99.0

Variables Cualitativas (Texto y Factores)

Ahora pasemos la segunda pregunta de nuestra encuesta: “Sexo”. Se sigue la misma lógica. Es una variable cualitativa y nominal. El tipo de dato en R será character (texto).

Advertencia¡Cuidado con la escritura!

R es sensible a mayúsculas y minúsculas (case-sensitive). Para R, "Hombre" y "hombre" son dos categorías completamente distintas. ¡Ojo con la limpieza de datos!

# Ingresamos las respuestas en texto (siempre entre comillas)
# Ojo: aquí solo ingresamos 8 datos a modo de ejemplo.
sexo <- c("Hombre", "Hombre", "Hombre", "Mujer", "Hombre", "Mujer", "Mujer", "Mujer")

summary(sexo) # Como es texto, el summary no calcula promedios, solo cuenta la longitud
   Length     Class      Mode 
        8 character character 
table(sexo)   # La tabla sí nos muestra cuántos hay de cada uno
sexo
Hombre  Mujer 
     4      4 
class(sexo)   # Nos dice que es tipo "character"
[1] "character"

En la práctica estadística, suele ser más eficiente ingresar la variable numéricamente como una dummy (usando 1 y 0) y luego convertirla a factor. Los factores son la forma especial en que R entiende y procesa las variables categóricas.

# Ingresamos los 9 datos codificados en números (0, 1 y un 9 para No Responde)
s <- c(1, 1, 1, 0, 1, 0, 0, 0, 9)

# Transformamos a factor.
# Ojo: si intentáramos factor(s, levels = c(0,1,9), labels = c("Mujer","Hombre"))
# R daría ERROR, porque hay 3 niveles pero solo 2 etiquetas. ¡Deben coincidir!

# Forma correcta (un label por cada level):
sexof <- factor(s, levels = c(0, 1, 9), labels = c("Mujer", "Hombre", "NC"))

summary(sexof) # ¡Ahora el summary sí nos cuenta las categorías correctamente!
 Mujer Hombre     NC 
     4      4      1 
table(sexof)
sexof
 Mujer Hombre     NC 
     4      4      1 

Finalmente, ingresemos el Nivel Socioeconómico (NSE) de nuestros encuestados. Esta es una variable ordinal. Categorías originales (NSE): 1=E, 2=D, 3=C3, 4=C2, 5=C1, 6=AB, 99=Valor perdido.

TipEl truco de los valores perdidos (NA)

Observa qué pasa con el encuestado número 9 (cuyo valor es 99). Como 99 no está declarado en los levels, R lo convertirá automáticamente en un NA (Not Available / Dato perdido). ¡Esta es una excelente forma de limpiar datos perdidos!

p1 <- c(1, 2, 2, 3, 4, 5, 5, 6, 99)

nse <- factor(p1, levels = c(1, 2, 3, 4, 5, 6), labels = c("E", "D", "C3", "C2", "C1", "AB"))

table(nse)
nse
 E  D C3 C2 C1 AB 
 1  2  1  1  2  1 
summary(nse) # Nos indicará cuántos NAs (datos perdidos) hay en la variable.
   E    D   C3   C2   C1   AB NA's 
   1    2    1    1    2    1    1 

5. Selección de elementos (Subsetting)

A veces no queremos ver toda la variable, sino aislar casos específicos. Podemos seleccionar (filtrar) elementos dentro de los vectores usando corchetes [ ]. El número dentro del corchete representa la posición del dato.

nse[4]           # Pedimos el 4to elemento (la respuesta de nuestro 4to encuestado)
[1] C3
Levels: E D C3 C2 C1 AB
nse[1:3]         # Pedimos un rango: los primeros 3 elementos
[1] E D D
Levels: E D C3 C2 C1 AB
nse[c(1, 3, 5)]  # Elementos específicos saltados usando la función c()
[1] E  D  C2
Levels: E D C3 C2 C1 AB
nse[37]          # Esta posición no existe (nos devuelve NA)
[1] <NA>
Levels: E D C3 C2 C1 AB
# También podemos filtrar a los que cumplan una característica específica:
nse[nse == "AB"] 
[1] AB   <NA>
Levels: E D C3 C2 C1 AB
length(nse)      # Nos dice cuántos elementos totales tiene el vector (9)
[1] 9
class(nse)       # Nos confirma que es un factor
[1] "factor"

6. Listas

Para agrupar elementos de distintos tipos y distintos tamaños en un solo gran objeto, debemos utilizar listas. Imagina una lista como una gran caja o archivero que contiene distintos documentos dentro.

# Creamos una lista que contiene un vector numérico (u) y un texto simple (v)
x <- list(u = c(2, 3, 4), v = "abc")
x 
$u
[1] 2 3 4

$v
[1] "abc"

Existen distintas formas de extraer un elemento guardado dentro de una lista:

  1. A partir de su nombre usando el operador dólar $.
  2. A partir de su posición usando corchetes dobles [[ ]].
x$u          # Extrae el elemento llamado 'u'
[1] 2 3 4
x[[2]]       # Extrae el segundo elemento de la lista (que es 'v')
[1] "abc"
x[[1]][2]    # Extrae el primer elemento, y DENTRO de él, extrae el 2do valor (el número 3)
[1] 3
str(x)       # Muestra la estructura interna (Structure) del objeto de manera resumida
List of 2
 $ u: num [1:3] 2 3 4
 $ v: chr "abc"

7. Data Frames (Bases de datos)

Un data frame (marco de datos) es simplemente una tabla donde cada columna es un vector y cada fila es un caso (un encuestado). La única regla es que todas las columnas deben tener el mismo largo. Los data frames son el formato estándar para analizar bases de datos reales.

Vamos a juntar las variables de nuestra encuesta (edad, sexof, nse) en una sola gran base de datos:

# Unimos los vectores de 9 elementos
base <- data.frame(edad, sexof, nse)

base # Imprimimos la base para verla como tabla

Podemos consultar y modificar los nombres de nuestras columnas (variables):

colnames(base) # Ver los nombres actuales
[1] "edad"  "sexof" "nse"  
# Cambiar el nombre de las columnas si queremos estandarizarlas
colnames(base) <- c("edad", "sexo", "nse") 

Navegando dentro de la base de datos: Podemos aislar y seleccionar variables específicas desde nuestra base usando el operador $. La estructura es nombredelabase$nombrevariable.

base$edad 
[1] 18 25 33 38 67 25 35 57 99

También podemos explorar la base usando corchetes con una lógica de coordenadas espaciales base[filas, columnas]:

base[5, 2]         # Fila 5, Columna 2 (El sexo de nuestro 5to encuestado)
[1] Hombre
Levels: Mujer Hombre NC
base[1:5, 2]       # Filas 1 a 5, Columna 2
[1] Hombre Hombre Hombre Mujer  Hombre
Levels: Mujer Hombre NC
base[1:5, c(1, 3)]  # Filas 1 a 5, pero solo las columnas 1 (edad) y 3 (nse)

Si unimos ambas lógicas, podemos filtrar casos que cumplan ciertas condiciones:

base$edad[1]                         # La edad exclusiva del sujeto 1
[1] 18
base$edad[base$sexo == "Hombre"]     # Extrae las edades, pero SOLO de los Hombres
[1] 18 25 33 67
Importante¿Te pareció un poco enredada esta última parte?

Filtrar datos usando la sintaxis de corchetes base$variable[base$otravariable == "condicion"] puede volverse muy largo y confuso en bases de datos reales como CASEN.

¡No te preocupes! En la próxima sesión introduciremos Tidyverse, un conjunto de paquetes modernos con una gramática mucho más humana y sencilla para hacer exactamente esto.

Funciones útiles de exploración rápida

R ofrece numerosas funciones para el análisis estadístico rápido. Aquí introducimos algunas elementales que usarás siempre al abrir una base nueva:

head(base)        # Muestra solo las primeras 6 filas (útil en bases gigantes)
# View(base)      # (Comentado) Abre la base en una pestaña nueva tipo Excel
str(base)         # Muestra la estructura de la base y el tipo de cada variable
'data.frame':   9 obs. of  3 variables:
 $ edad: num  18 25 33 38 67 25 35 57 99
 $ sexo: Factor w/ 3 levels "Mujer","Hombre",..: 2 2 2 1 2 1 1 1 3
 $ nse : Factor w/ 6 levels "E","D","C3","C2",..: 1 2 2 3 4 5 5 6 NA
table(base$sexo)  # Tabla de frecuencias absolutas para el sexo

 Mujer Hombre     NC 
     4      4      1 
mean(base$edad)   # Calcula el promedio de la variable edad
[1] 44.11111
# help(table)     # Abre la documentación oficial de cómo usar una función
# ?table          # Atajo equivalente al comando anterior

Si quisieras guardar tu base de datos procesada para enviarla a un colega o no perderla, usarías:

# Se indica primero el objeto a guardar y luego el nombre del archivo, entre comillas.
# save(base, file = "base_encuesta.RData") 

8. Limpieza del entorno de trabajo

A medida que avanzamos en un análisis complejo, el Environment se va llenando de objetos temporales y variables sueltas. Es importante mantener un entorno de trabajo organizado. Podemos eliminar objetos usando la función rm() (remove).

# Borramos el vector suelto 'edad'
rm(edad) 

# ¡Ojo! Borramos el vector suelto, pero la variable 'edad' SIGUE viviendo a salvo 
# dentro del data frame llamado 'base'. Puedes comprobarlo corriendo: base$edad
AdvertenciaBotón de pánico

Si deseas reiniciar tu entorno por completo y borrar absolutamente TODO, puedes usar el comando rm(list = ls()) o hacer clic en el ícono de la escoba 🧹 en la pestaña Environment de RStudio. Úsalo con precaución.