Curso
- Crear subconjuntos de filas y columnas por índice
- Crear subconjuntos de filas y columnas por nombre
- Crear subconjuntos de filas y columnas por valor
- Ejercicios prácticos
Tanto si estás comparando cómo responden distintos perfiles demográficos a campañas de marketing, como si quieres centrarte en un periodo concreto o extraer información de unos pocos productos del inventario, crear subconjuntos de datos te permite aislar observaciones útiles dentro de tu dataset. R es una gran herramienta que hace que crear subconjuntos sea fácil e intuitivo. Al final de este tutorial, sabrás extraer justo la información que buscas de tu conjunto de datos.
Crear un subconjunto no cambia el contenido de tus datos, simplemente selecciona la parte más relevante para tu objetivo. En general, hay tres maneras de seleccionar filas y columnas en tu dataset—por índice, por nombre y por valor.
Crear subconjuntos de filas y columnas por índice
Una forma de seleccionar filas y columnas es mediante los índices del dataset. Es lo mismo que referirte a tus filas y columnas como "la primera fila", "todas las filas de las columnas segunda y quinta" o "la primera fila de las columnas de la segunda a la quinta". Vamos a expresar estas frases usando un dataset llamado iris en R. Según su documentación, "[e]ste famoso conjunto de datos de iris (de Fisher o Anderson) proporciona las medidas en centímetros de la longitud y anchura del sépalo y la longitud y anchura del pétalo, respectivamente, para 50 flores de cada una de las 3 especies de iris. Las especies son Iris setosa, versicolor y virginica."
# "La primera fila":
iris[1, ]
# "Todas las filas de las columnas 2 y 5":
iris[, c(2, 5)]
# "La primera fila de las columnas de la 2 a la 5":
iris[1, 2:5]
Para crear un subconjunto, se usan corchetes después del objeto que contiene tus datos. Las filas se indican como el primer elemento dentro de los corchetes y las columnas como el segundo, separados por una coma:
data[rows, columns]
Crear subconjuntos de filas y columnas por nombre
En R, las filas y columnas de tu dataset tienen atributos de nombre. Los nombres de fila se usan poco y por defecto proporcionan índices (enteros desde 1 hasta el número de filas del dataset), justo como has visto en la sección anterior. De hecho, si llamas a rownames() sobre el dataset iris, verás que simplemente están indexados del 1 al 150:
> rownames(iris)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14"
[15] "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28"
[29] "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42"
[43] "43" "44" "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56"
[57] "57" "58" "59" "60" "61" "62" "63" "64" "65" "66" "67" "68" "69" "70"
[71] "71" "72" "73" "74" "75" "76" "77" "78" "79" "80" "81" "82" "83" "84"
[85] "85" "86" "87" "88" "89" "90" "91" "92" "93" "94" "95" "96" "97" "98"
[99] "99" "100" "101" "102" "103" "104" "105" "106" "107" "108" "109" "110" "111" "112"
[113] "113" "114" "115" "116" "117" "118" "119" "120" "121" "122" "123" "124" "125" "126"
[127] "127" "128" "129" "130" "131" "132" "133" "134" "135" "136" "137" "138" "139" "140"
[141] "141" "142" "143" "144" "145" "146" "147" "148" "149" "150"
> nrow(iris)
[1] 150
Los nombres de fila son más habituales en datasets pequeños y sirven para identificar fácilmente las observaciones. Por ejemplo, en un conjunto de datos reducido con información sanitaria de pacientes de un médico, los nombres de fila podrían ser los nombres completos de los pacientes.
Los nombres de columna, en cambio, están presentes en prácticamente cualquier dataset. Puedes acceder a ellos con la función colnames() o con names():
colnames(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
Para crear un subconjunto por los nombres de filas y columnas, usa de nuevo los corchetes, precedidos por el objeto del dataset:
# Ancho del sépalo de la quinta observación
iris["5", "Sepal.Width"]
# Ancho del sépalo y ancho del pétalo
iris[, c("Sepal.Width", "Petal.Width")]
Es importante tener en cuenta que tanto los nombres de fila como los de columna son caracteres, así que es imprescindible usar comillas simples o dobles.
Crear subconjuntos de filas y columnas por valor
Seleccionar filas y columnas por valor suele ser lo más flexible. Por ejemplo, puedes extraer los datos de Iris setosa usando una condición como esta:
> iris[iris$Species == "setosa", ]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
...
47 5.1 3.8 1.6 0.2 setosa
48 4.6 3.2 1.4 0.2 setosa
49 5.3 3.7 1.5 0.2 setosa
50 5.0 3.3 1.4 0.2 setosa
Las expresiones condicionales como iris$Species == "setosa" van en el elemento de filas dentro de los corchetes (es decir, el primer elemento antes de la coma). Además de la condición en el primer elemento, puedes indicar las columnas por índice o por nombre en el segundo. En la consola de abajo, prueba a seleccionar solo las medidas del sépalo de Iris setosa:
# Imprime las medidas del sépalo para setosa
# Imprime las medidas del sépalo para setosa (por nombre)
iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]
# Imprime las medidas del sépalo para setosa (por índice)
iris[iris$Species == "setosa", 1:2]
test_or(
test_output_contains('iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]',
incorrect_msg = "Selecciona solo las columnas Sepal.Length y Sepal.Width para setosa, por nombre o por índice."), test_output_contains('iris[iris$Species == "setosa", c("Sepal.Width", "Sepal.Length")]', incorrect_msg = "Selecciona solo las columnas Sepal.Length y Sepal.Width para setosa, por nombre o por índice.")) success_msg("¡Buen trabajo!") Resumen
En este tutorial:
- Has aprendido a crear subconjuntos de tu data frame por índice. Las filas y columnas se indexan con enteros desde 1 hasta el número de filas y columnas, respectivamente.
- Has aprendido a crear subconjuntos por nombre. Has visto que los nombres de fila rara vez se especifican y que los nombres de columna son de tipo carácter.
- Has aprendido a usar condiciones en el elemento de filas dentro de corchetes para crear subconjuntos por valor.
- Has aprendido a combinar estos métodos para lograr una selección más flexible (por ejemplo, usando condiciones para las filas y seleccionando por índice o nombre para las columnas).
A continuación, encontrarás unos ejercicios para reforzar lo aprendido. La práctica hace al maestro, ¡así que anímate a intentarlos!
Ejercicios prácticos
Selecciona todas las observaciones en las que el ancho del sépalo sea mayor que la longitud del pétalo.
# ¿Qué observaciones tienen mayor ancho de sépalo que longitud de pétalo?
# ¿Qué observaciones tienen mayor ancho de sépalo que longitud de pétalo?
iris[iris$Sepal.Width > iris$Petal.Length, ]
test_output_contains('iris[iris$Sepal.Width > iris$Petal.Length, ]',
incorrect_msg = paste("Selecciona las observaciones en las que los valores de Sepal.Width", "sean mayores que los valores de Petal.Length.")) success_msg("¡Bien! Resulta que solo Iris setosa tiene esta forma.")
iris$Sepal.Width > iris$Petal.Length dentro de los corchetes. ¡No olvides la coma!Selecciona todas las Iris versicolor cuyo ancho del sépalo sea mayor que el ancho medio del sépalo entre todas las especies.
# Guarda los datos de versicolor en un objeto llamado versicolor
# Selecciona todas las Iris versicolor con un ancho de sépalo superior a la media
# Guarda los datos de versicolor en un objeto llamado versicolor
versicolor <- iris[iris$Species == "versicolor", ]
# Selecciona todas las Iris versicolor con un ancho de sépalo superior a la media
versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]
test_object('versicolor',
undefined_msg = "¿Has definido el objeto versicolor?", incorrect_msg = paste("Selecciona donde Species sea igual a \"versicolor\".", "¡Recuerda usar el operador ==!")) test_output_contains('versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]', incorrect_msg = paste("¡Casi! ¿Estás usando la función mean()", "para calcular el ancho medio del sépalo en todas las especies", "y no solo en Iris versicolor?")) success_msg("¡Gran trabajo!")
mean() para calcular el ancho medio del sépalo en iris y luego una condición, prefijada por versicolor, para quedarte solo con los valores por encima de la media.Indica el ancho medio del sépalo para todas las Iris virginica que tengan longitudes de pétalo menores de 5 centímetros.
# ¡Puedes abordar este problema como prefieras!
# Guarda los datos de virginica en un objeto llamado virginica
virginica <- iris[iris$Species == "virginica", ]
# Ancho medio del sépalo para Iris virginica con longitudes de pétalo menores de 5
mean(virginica[virginica$Petal.Length < 5, ]$Sepal.Width)
test_output_contains('2.8',
incorrect_msg = "¡Incorrecto! ¡Este es difícil!")
success_msg("¡Excelente!")
Petal.Length sea menor que 5. Puedes obtener la media con la función mean().¿Quieres aprender más formas de extraer insights de tus datos? Echa un vistazo a estos cursos en DataCamp.
Revisa también nuestro tutorial Merging Datasets in R.
Tanto si estás comparando cómo responden distintos perfiles demográficos a campañas de marketing, como si quieres centrarte en un periodo concreto o extraer información de unos pocos productos del inventario, crear subconjuntos de datos te permite aislar observaciones útiles dentro de tu dataset. R es una gran herramienta que hace que crear subconjuntos sea fácil e intuitivo. Al final de este tutorial, sabrás extraer justo la información que buscas de tu conjunto de datos.
Crear un subconjunto no cambia el contenido de tus datos, simplemente selecciona la parte más relevante para tu objetivo. En general, hay tres maneras de seleccionar filas y columnas en tu dataset: por índice, por nombre y por valor.
Crear subconjuntos de filas y columnas por índice
Una forma de seleccionar filas y columnas es mediante los índices del dataset. Es lo mismo que referirte a tus filas y columnas como "la primera fila", "todas las filas de las columnas segunda y quinta" o "la primera fila de las columnas de la segunda a la quinta". Vamos a expresar estas frases usando un dataset llamado iris en R. Según su documentación, "[e]ste famoso conjunto de datos de iris (de Fisher o Anderson) proporciona las medidas en centímetros de la longitud y anchura del sépalo y la longitud y anchura del pétalo, respectivamente, para 50 flores de cada una de las 3 especies de iris. Las especies son Iris setosa, versicolor y virginica."
# "La primera fila":
iris[1, ]
# "Todas las filas de las columnas 2 y 5":
iris[, c(2, 5)]
# "La primera fila de las columnas de la 2 a la 5":
iris[1, 2:5]
Para crear un subconjunto, se usan corchetes después del objeto que contiene tus datos. Las filas se indican como el primer elemento dentro de los corchetes y las columnas como el segundo, separados por una coma:
data[rows, columns]
Crear subconjuntos de filas y columnas por nombre
En R, las filas y columnas de tu dataset tienen atributos de nombre. Los nombres de fila se usan poco y por defecto proporcionan índices (enteros desde 1 hasta el número de filas del dataset), justo como has visto en la sección anterior. De hecho, si llamas a rownames() sobre el dataset iris, verás que simplemente están indexados del 1 al 150:
> rownames(iris)
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14"
[15] "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28"
[29] "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42"
[43] "43" "44" "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56"
[57] "57" "58" "59" "60" "61" "62" "63" "64" "65" "66" "67" "68" "69" "70"
[71] "71" "72" "73" "74" "75" "76" "77" "78" "79" "80" "81" "82" "83" "84"
[85] "85" "86" "87" "88" "89" "90" "91" "92" "93" "94" "95" "96" "97" "98"
[99] "99" "100" "101" "102" "103" "104" "105" "106" "107" "108" "109" "110" "111" "112"
[113] "113" "114" "115" "116" "117" "118" "119" "120" "121" "122" "123" "124" "125" "126"
[127] "127" "128" "129" "130" "131" "132" "133" "134" "135" "136" "137" "138" "139" "140"
[141] "141" "142" "143" "144" "145" "146" "147" "148" "149" "150"
> nrow(iris)
[1] 150
Los nombres de fila son más habituales en datasets pequeños y sirven para identificar fácilmente las observaciones. Por ejemplo, en un conjunto de datos reducido con información sanitaria de pacientes de un médico, los nombres de fila podrían ser los nombres completos de los pacientes.
Los nombres de columna, en cambio, están presentes en prácticamente cualquier dataset. Puedes acceder a ellos con la función colnames() o con names():
colnames(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
Para crear un subconjunto por los nombres de filas y columnas, usa de nuevo los corchetes, precedidos por el objeto del dataset:
# Ancho del sépalo de la quinta observación
iris["5", "Sepal.Width"]
# Ancho del sépalo y ancho del pétalo
iris[, c("Sepal.Width", "Petal.Width")]
Es importante tener en cuenta que tanto los nombres de fila como los de columna son caracteres, así que es imprescindible usar comillas simples o dobles.
Crear subconjuntos de filas y columnas por valor
Seleccionar filas y columnas por valor suele ser lo más flexible. Por ejemplo, puedes extraer los datos de Iris setosa usando una condición como esta:
> iris[iris$Species == "setosa", ]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
...
47 5.1 3.8 1.6 0.2 setosa
48 4.6 3.2 1.4 0.2 setosa
49 5.3 3.7 1.5 0.2 setosa
50 5.0 3.3 1.4 0.2 setosa
Las expresiones condicionales como iris$Species == "setosa" van en el elemento de filas dentro de los corchetes (es decir, el primer elemento antes de la coma). Además de la condición en el primer elemento, puedes indicar las columnas por índice o por nombre en el segundo. En la consola de abajo, prueba a seleccionar solo las medidas del sépalo de Iris setosa:
# Imprime las medidas del sépalo para setosa
# Imprime las medidas del sépalo para setosa (por nombre)
iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]
# Imprime las medidas del sépalo para setosa (por índice)
iris[iris$Species == "setosa", 1:2]
test_or(
test_output_contains('iris[iris$Species == "setosa", c("Sepal.Length", "Sepal.Width")]',
incorrect_msg = "Selecciona solo las columnas Sepal.Length y Sepal.Width para setosa, por nombre o por índice."), test_output_contains('iris[iris$Species == "setosa", c("Sepal.Width", "Sepal.Length")]', incorrect_msg = "Selecciona solo las columnas Sepal.Length y Sepal.Width para setosa, por nombre o por índice.")) success_msg("¡Buen trabajo!") Resumen
En este tutorial:
- Has aprendido a crear subconjuntos de tu data frame por índice. Las filas y columnas se indexan con enteros desde 1 hasta el número de filas y columnas, respectivamente.
- Has aprendido a crear subconjuntos por nombre. Has visto que los nombres de fila rara vez se especifican y que los nombres de columna son de tipo carácter.
- Has aprendido a usar condiciones en el elemento de filas dentro de corchetes para crear subconjuntos por valor.
- Has aprendido a combinar estos métodos para lograr una selección más flexible (por ejemplo, usando condiciones para las filas y seleccionando por índice o nombre para las columnas).
A continuación, encontrarás unos ejercicios para reforzar lo aprendido. La práctica hace al maestro, ¡así que anímate a intentarlos!
Ejercicios prácticos
Selecciona todas las observaciones en las que el ancho del sépalo sea mayor que la longitud del pétalo.
# ¿Qué observaciones tienen mayor ancho de sépalo que longitud de pétalo?
# ¿Qué observaciones tienen mayor ancho de sépalo que longitud de pétalo?
iris[iris$Sepal.Width > iris$Petal.Length, ]
test_output_contains('iris[iris$Sepal.Width > iris$Petal.Length, ]',
incorrect_msg = paste("Selecciona las observaciones en las que los valores de Sepal.Width", "sean mayores que los valores de Petal.Length.")) success_msg("¡Bien! Resulta que solo Iris setosa tiene esta forma.")
iris$Sepal.Width > iris$Petal.Length dentro de los corchetes. ¡No olvides la coma!Selecciona todas las Iris versicolor cuyo ancho del sépalo sea mayor que el ancho medio del sépalo entre todas las especies.
# Guarda los datos de versicolor en un objeto llamado versicolor
# Selecciona todas las Iris versicolor con un ancho de sépalo superior a la media
# Guarda los datos de versicolor en un objeto llamado versicolor
versicolor <- iris[iris$Species == "versicolor", ]
# Selecciona todas las Iris versicolor con un ancho de sépalo superior a la media
versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]
test_object('versicolor',
undefined_msg = "¿Has definido el objeto versicolor?", incorrect_msg = paste("Selecciona donde Species sea igual a \"versicolor\".", "¡Recuerda usar el operador ==!")) test_output_contains('versicolor[versicolor$Sepal.Width > mean(iris$Sepal.Width), ]', incorrect_msg = paste("¡Casi! ¿Estás usando la función mean()", "para calcular el ancho medio del sépalo en todas las especies", "y no solo en Iris versicolor?")) success_msg("¡Gran trabajo!")
mean() para calcular el ancho medio del sépalo en iris y luego una condición, prefijada por versicolor, para quedarte solo con los valores por encima de la media.Indica el ancho medio del sépalo para todas las Iris virginica que tengan longitudes de pétalo menores de 5 centímetros.
# ¡Puedes abordar este problema como prefieras!
# Guarda los datos de virginica en un objeto llamado virginica
virginica <- iris[iris$Species == "virginica", ]
# Ancho medio del sépalo para Iris virginica con longitudes de pétalo menores de 5
mean(virginica[virginica$Petal.Length < 5, ]$Sepal.Width)
test_output_contains('2.8',
incorrect_msg = "¡Incorrecto! ¡Este es difícil!")
success_msg("¡Excelente!")
Petal.Length sea menor que 5. Puedes obtener la media con la función mean().¿Quieres aprender más formas de extraer insights de tus datos? Echa un vistazo a estos cursos en DataCamp.
Revisa también nuestro tutorial Merging Datasets in R.