Marcos de Datos en R

DataScience
R
Published

June 13, 2026

Modified

June 13, 2026

Un marco de datos (o dataframe) en R es un arreglo de elementos que nos puede recordar a las matrices. ya que también está compuesto por filas y columnas. Sin embargo, hay diferencias con aquellas, por ejemplo, las columnas se corresponden con las variables del conjunto de datos y las filas con las observaciones de este. Otra diferencia es que un marco de datos puede contener tipos de datos diferentes: numéricos, textuales, lógicos, factores y demás.

Explorando un marco de datos

Vamos a cargar en R un marco de datos que ya viene con su instalación: mtcars. Basta con escribir su nombre:

Code
mtcars
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

Como podemos notar, son demasiados datos. Podemos mostrar unos cuantos de ellos si utilizamos la sentencia head() para los primeros o tail() para los últimos. Mostremos los primeros cinco y los últimos cuatro:

Code
# Mostremos los primeros cinco elementos
head(mtcars, 5)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Code
# Mostremos los últimos cuatro
tail(mtcars)
                mpg cyl  disp  hp drat    wt qsec vs am gear carb
Porsche 914-2  26.0   4 120.3  91 4.43 2.140 16.7  0  1    5    2
Lotus Europa   30.4   4  95.1 113 3.77 1.513 16.9  1  1    5    2
Ford Pantera L 15.8   8 351.0 264 4.22 3.170 14.5  0  1    5    4
Ferrari Dino   19.7   6 145.0 175 3.62 2.770 15.5  0  1    5    6
Maserati Bora  15.0   8 301.0 335 3.54 3.570 14.6  0  1    5    8
Volvo 142E     21.4   4 121.0 109 4.11 2.780 18.6  1  1    4    2

Así tenemos un mejor control sobre lo que mostramos. Si por otro lado lo que queremos ver es la estructura del marco de datos, podemos usar str():

Code
str(mtcars)
'data.frame':   32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

Esto nos mostrará el número de observaciones y de variables, además de enlistar estas últimas junto con su tipo de dato y sus primeras observaciones.

Creando un marco de datos

Vamos a crear nuestro propio marco de datos a partir de unos vectores. Tomaremos de ejemplo unos que contienen información sobre los planetas de nuestro sistema solar: tipo de planeta, el diámetro y la rotación en proporción con el diámetro de la Tierra, y si tiene anillos o no.

Code
# Creamos los vectores
nombre <-
  c("Mercurio", "Venus", "Tierra", "Marte", "Júpiter", "Saturno",
    "Urano", "Neptuno")
tipo <-
  c("Terrestre", "Terrestre", "Terrestre", "Terrestre", "Gaseoso",
    "Gaseoso", "Gaseoso", "Gaseoso")
diametro <- c(0.382, 0.949, 1, 0.532, 11.209, 9.449, 4.007, 3.883)
rotacion <- c(58.64, -243.02, 1, 1.03, 0.41, 0.43, -0.72, 0.67)
anillos <- c(FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE)

Y con estos elementos creados podemos ya armar el marco de datos:

Code
# Creamos el marco de datos
planetas <- data.frame(nombre, tipo, diametro, rotacion, anillos)

# Mostramos el marco
planetas
    nombre      tipo diametro rotacion anillos
1 Mercurio Terrestre    0.382    58.64   FALSE
2    Venus Terrestre    0.949  -243.02   FALSE
3   Tierra Terrestre    1.000     1.00   FALSE
4    Marte Terrestre    0.532     1.03   FALSE
5  Júpiter   Gaseoso   11.209     0.41    TRUE
6  Saturno   Gaseoso    9.449     0.43    TRUE
7    Urano   Gaseoso    4.007    -0.72    TRUE
8  Neptuno   Gaseoso    3.883     0.67    TRUE

Veamos su estructura:

Code
str(planetas)
'data.frame':   8 obs. of  5 variables:
 $ nombre  : chr  "Mercurio" "Venus" "Tierra" "Marte" ...
 $ tipo    : chr  "Terrestre" "Terrestre" "Terrestre" "Terrestre" ...
 $ diametro: num  0.382 0.949 1 0.532 11.209 ...
 $ rotacion: num  58.64 -243.02 1 1.03 0.41 ...
 $ anillos : logi  FALSE FALSE FALSE FALSE TRUE TRUE ...

Contamos con variables textuales, numéricas y lógicas.

Seleccionando elementos

Se realiza con la misma lógica que las matrices, es decir, usando corchetes y dos índices, el primero para las filas y el segundo para las columnas. A modo de ejemplo, seleccionemos y mostremos el diámetro de Mercurio (se encuentra en la primera fila y tercera columna):

Code
planetas[1,3]
[1] 0.382

Ahora mostremos toda la información de Marte (cuarta fila):

Code
planetas[4,]
  nombre      tipo diametro rotacion anillos
4  Marte Terrestre    0.532     1.03   FALSE

También es posible seleccionar los elementos con base en el nombre de la columna (o más bien, el de la variable). Por ejemplo, vamos a buscar e imprimir solo el diámetro de los primeros cinco planetas:

Code
planetas[1:5, "diametro"]
[1]  0.382  0.949  1.000  0.532 11.209

Por otro lado, si lo que queremos es mostrar toda una columna, simplemente escribimos el nombre del marco seguido por el signo $ y enseguida el nombre de dicha columna:

Code
planetas$diametro
[1]  0.382  0.949  1.000  0.532 11.209  9.449  4.007  3.883

Por último, si tenemos variables lógicas, podemos seleccionar las observaciones de las cuales el valor sea verdadero. Tomemos como ejemplo si el planeta tiene anillos o no. Si escribimos el nombre de la variable como criterio de selección, solo mostrará aquellas filas en las que dicha variable tenga el valor TRUE:

Code
planetas[planetas$anillos,]
   nombre    tipo diametro rotacion anillos
5 Júpiter Gaseoso   11.209     0.41    TRUE
6 Saturno Gaseoso    9.449     0.43    TRUE
7   Urano Gaseoso    4.007    -0.72    TRUE
8 Neptuno Gaseoso    3.883     0.67    TRUE

Subconjuntos

Una función muy útil es subset(), la cual nos permite crear subconjuntos dentro de los marcos de datos que cumplan cierto criterio. Pudimos haberla usado para seleccionar solo planetas con anillos:

Code
# Subconjunto de planetas con anillos
subset(planetas, anillos)
   nombre    tipo diametro rotacion anillos
5 Júpiter Gaseoso   11.209     0.41    TRUE
6 Saturno Gaseoso    9.449     0.43    TRUE
7   Urano Gaseoso    4.007    -0.72    TRUE
8 Neptuno Gaseoso    3.883     0.67    TRUE

Pero también podemos agregar criterios a nuestro gusto:

Code
# Mostremos planetas con diámetro menor a la Tierra
subset(planetas, diametro < 1)
    nombre      tipo diametro rotacion anillos
1 Mercurio Terrestre    0.382    58.64   FALSE
2    Venus Terrestre    0.949  -243.02   FALSE
4    Marte Terrestre    0.532     1.03   FALSE

Ordenando marcos

Es posible ordenar los datos de un marco con base en el valor de alguna de sus variables. Para ello echamos mano de la función order(), la cual nos da la posición de cada elemento enlistado y que si la aplicamos a un marco lo ordena, siempre y cuando la usemos como sigue:

Code
# Ordenamos filas de acuerdo al diámetro
planetas[order(planetas$diametro),]
    nombre      tipo diametro rotacion anillos
1 Mercurio Terrestre    0.382    58.64   FALSE
4    Marte Terrestre    0.532     1.03   FALSE
2    Venus Terrestre    0.949  -243.02   FALSE
3   Tierra Terrestre    1.000     1.00   FALSE
8  Neptuno   Gaseoso    3.883     0.67    TRUE
7    Urano   Gaseoso    4.007    -0.72    TRUE
6  Saturno   Gaseoso    9.449     0.43    TRUE
5  Júpiter   Gaseoso   11.209     0.41    TRUE

Perfecto, hemos abordado lo básico de los marcos de datos en R. Lo siguiente son las listas.

Back to top