Santiago Humberto Londoño Restrepo
March 1, 2016
Esta semana aprenderemos a seleccionar datos a partir de un objeto de almacenamiento, en esta ocasión trabajaremos sobre vectores. La selección de datos es una cualidad que debes de desarrollar ya que, dada mi experiencia, es una de las actividades más utilizadas y de vital importancia para el desarrollo de cualquier análisis de datos. Imágina que tienes en tus manos una base de datos con muchos registros y variables y deseas seleccionar aquellos registros que cumplan dos o más caracterísiticas en especial que son fundamentales para tu proyeto de investigación; por cosas del destino tu no sabes cómo seleccionar dicha información y la seleccionas de forma manual, ¿cuánto te demorarias si la base de datos estuvierá conformada por 20534 registros? En clase aprenderemos a utilizar todo el poder de R para superar tan importante problema. Así que manos a la obra.
Siguiendo el ejemplo de la clase anterior, sabemos que somos unos tesos en el juego del poker. Supongamos que nuestra nueva ruta de investigación se dirige en comparar nuestro desempeño en el inicio de semana con el final.
Para responder a ese nuevo rumbo, es indudable seleccionar información específica del vector poker. Suponga que los días Lunes, Martes, Miercoles son el inicio de semana y los días Jueves y Viernes son el final de la semana.
Pregunta - ¿Qué información seleccionarías para responder al nuevo rumbo de la investigación?
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Se obtiene el mismo resultado
poker## Lunes Martes Miércoles Jueves Viernes
## 140 -50 20 -120 240
ruleta## Lunes Martes Miércoles Jueves Viernes
## -24 -50 100 -350 10
Para responder nuestra nueva pregunta de investigación, es indudable que nos debemos concentrar en el vector poker y seleccionar los datos de mi interés. En otras palabras nuestro objetivo es seleccionar elementos específicos del vector poker.
Para seleccionar elementos de un vector (y más tarde en otros datos de almacenamiento como los data.frames) se utilizan los corchetes, [ ]
Por ejemplo para seleccionar el primer elemento del vector poker, tu debes escribir
para el segundo elemento debes escribir
y así sucesivamente.
Ejemplo
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Primer elemento del vector poker
poker[1]## Lunes
## 140
#Segundo elemento del vector poker
poker[2]## Martes
## -50
Ejercicio
¿Qué código debe escribir si le piden que asigne a la variable ruleta_jueves el resultado del juego ruleta obtenido el día Jueves? ¿Qué debe hacer para imprimirla?
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Vector rulteta_jueves
ruleta_jueves <- ruleta[4]
#Imprimir la variable
ruleta_jueves## Jueves
## -350
Suponga que le piden seleccionar del vector poker los días lunes, miércoles y viernes. Para hacerlo utilizas nuevamente los corchetes, y dentro de esos, escribes qué elementos deberían ser seleccionados:
poker[c(1, 3, 5)]
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Selecciono día lunes, miércoles y viernes del vector poker
poker[c(1, 3, 5)]## Lunes Miércoles Viernes
## 140 20 240
Ejercicio
Suponga que le piden asignar al vector poker_entre_semana el resultado del juego poker obtenido los día martes, miércoles y jueves e imprimirlo.
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Creo variable poker_entre_semana
poker_entre_semana <- poker[c(2,3,4)]
#Imprimo variable poker_entre_semana
poker_entre_semana## Martes Miércoles Jueves
## -50 20 -120
La anterior selección poker[c(2,3,4)] no es una forma conveniente de hacerla cuando se trabaja con vectores que almacenan más de 5 elementos.
Una forma fácil de hacer la selección poker[c(2,3,4)] es poker[c(2:4)]
Observemos que sucede si utilizamos esta nueva herramienta para resolver el ejercicio anterior.
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Creo variable poker_entre_semana
poker_entre_semana <- poker[c(2:4)]
#Imprimo variable poker_entre_semana
poker_entre_semana## Martes Miércoles Jueves
## -50 20 -120
Ejercicio
Asigne al vector vector_seleccion_ruleta los resultados obtenidos desde el día martes hasta el viernes, usando la nueva herramienta : e imprimalo
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Creación vector_seleccion_ruleta
vector_seleccion_ruleta <- ruleta[c(2:5)]
#Imprimir
vector_seleccion_ruleta## Martes Miércoles Jueves Viernes
## -50 100 -350 10
Otra forma de resolver el ejercicio anterior es por medio del uso del nombre de los elementos del vector (Lunes, Martes, …) en lugar de su posición númerica. Por ejemplo:
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Selección del primer elemento del vector poker con el nombre de ese elemento
poker[c("Lunes")]## Lunes
## 140
Observe que el código anterior seleccionará el primer elemento del vector poker ya que Lunes es el nombre del primer elemento.
Para el caso de una selección múltiple utilizando el nombre de los elementos de un vector sería
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Selección múltiple:
#selección del segundo y quinto elemento del vector poker con sus respectivos nombres
ruleta[c("Martes", "Viernes")]## Martes Viernes
## -50 10
Ejercicio Calcule las ganancias promedio para el juego poker durante los primeros tres dias de la semana seleccionando esos elementos con la ayuda de los nombres. Asigne este valor al vector ganancias_primeros_3_dias_poker e imprimalo. Usted puede usar la función mean() para obtener el valor promedio de los elementos de un vector númerico.
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Creo el vector ganancias_primeros_3_dias
ganancias_primeros_3_dias_poker <- mean(poker[c(1:3)])
ganancias_primeros_3_dias_poker## [1] 36.66667
En el mundo real es frecuente enfrentarse con problemas de selección donde las anteriores herramientas no son las más pertinentes. Afortunadamente existen los operadores de comparación, los cuales nos harán la vida mucho más fácil.
Primero recordemos que los operadores de comparación son:
Previamente vimos que:
7 < 9## [1] TRUE
7 > 9## [1] FALSE
7 != 9## [1] TRUE
8 == 9## [1] FALSE
Lo cheveré de R es que las comparaciones no sólo se pueden hacer entre números sino también entre vectores. Toma un poco de tiempo y analiza el siguiente código:
x <- c(4, 5, 6)
x >= 5## [1] FALSE TRUE TRUE
Suponga que deseo seleccionar del vector x <- c(4, 5, 6) aquellos valores que son mayores o iguales que 5
x <- c(4, 5, 6)
x >= 5## [1] FALSE TRUE TRUE
x[x >= 5]## [1] 5 6
Analiza el siguiente código, simplemente es el mismo código anterior adicionandole un poco más de elegancia.
x <- c(4, 5, 6)
#Creo un vector de selección que se llame condicion_de_seleccion
condicion_de_seleccion <- x >= 5
#Creo un vector que contenga los valores mayores o iguales que cinco,
#a ese vector lo llamo vector_resultado y lo imprimo.
#Observe que para crear el vector_resultado utilice
#el vector_de_selección creado previamente.
vector_resultado <- x[condicion_de_seleccion]
#Finalmente imprimo
vector_resultado## [1] 5 6
Ejercicio Siguiendo el ejemplo del casino:
Recuerda los datos son:
#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana#Vector poker
poker <- c(140, -50, 20, -120, 240)
#Vector ruleta
ruleta <- c(-24, -50, 100, -350, 10)
#Creo un vector con los nombres de la semana
nombres_semana <- c("Lunes", "Martes", "Miércoles", "Jueves", "Viernes")
#Doy nombre a los elementos de los vectores poker y ruleta respectivamente.
names(poker) <- nombres_semana
names(ruleta) <- nombres_semana
#Creo vectores de selección para cada uno de los juegos.
#Es muy importante que cada uno de esos vectores sean creados
#utilizando las condiciones que requiere el problema
condicion_de_seleccion_poker <- poker < 0
condicion_de_seleccion_ruleta <- ruleta < 0
#Luego creo los vectores que me pide el problema,
#los cuales se crean a partir del los vectores de selección
#creados previamente
promedio_perdidas_poker <- mean(poker[condicion_de_seleccion_poker])
promedio_perdidas_ruleta <- mean(ruleta[condicion_de_seleccion_ruleta])
#Imprimo los resultados
#Para poker
promedio_perdidas_poker## [1] -85
#Para ruleta
promedio_perdidas_ruleta## [1] -141.3333