Chapter 4 VECTORES ALEATORIOS y SELECCIÓN DE ELEMENTOS.
En este capítulo usted aprenderá a crear vectores de elementos aleatorios, así también, cómo seleccionar uno o varios elementos de un vector, a crear vectores vacíos y conocer el tamaño de los vectores.
Quizá le parezca muy abstracto lo que se desarrollará en este capítulo, quizá usted se pregunte, ¿en el dia a día cómo voy a trabajar con vectores? o ¿para qué me servirá seleccionar elementos?. Déjeme decirle que en capítulos posteriores, los vectores se convertirán en columnas y las columnas en variables y las variables juntas generarán un dataframe o base de datos. Así que comprender cómo seleccionar elementos o saber el tamaño de vectores le permitirán filtrar observaciones en un futuro.
En este y en el siguiente capítulo está lo más fundamental, si uno desea conocer el funcionamiento y en un futuro empezar a programar en el software R. Es asi que se recomienda leer, estos dos capítulos, las veces que sea posible hasta que quede asimilado por completo.
4.1 Creación de vectores con elementos aleatorios.
Para poder crear vectores con elementos aleatorios tendremos que usar la función sample()
. Veamos a continuación su sintaxis.
sample(x, size, replace = FALSE, prob = NULL)
Donde:
x
: Elemento o vector que contiene el universo de elementos.
size
: Es el tamaño del vector resultante. Es decir, el número de elementos de nuestro vector generado.
replace
: Argumento lógico que indica si se escogeran los elementos con reemplazo o no. Su valor por defecto es FALSE
, lo que implica que la elección de elementos sea sin reemplazos.
prob
: Vector de probabilidades que indica la ocurrencia de los elementos del elemento o vector x
.
Para comprender su funcionamiento, veamos un ejemplo. Si queremos escoger aleatorimente 5 elementos de un vector con elementos del 1 al 10.
# Escogiendo aleatoriamente 5 elementos.
sample(x=1:10, size = 5)
## [1] 3 8 2 5 10
El vector que contiene el universo de donde se escogeran los 5 números aleatoriamente es 1:10
. Asimismo, con el argumento size=5
le estamos indicando que escoga 5 elementos. Está escogiendo 5 números distintos, ya que el argumento replace
se está dejando con su valor por defecto que es FALSE
, es decir, sin reemplazos.
Es preciso aclarar que usted obtendrá resultados distintos cada vez que ejecute el ejemplo, ya que en cada ejecución el software utiliza un algoritmo distinto para seleccionar elementos. Es decir, está escogiendo aleatoriamente los elementos en cada ejecución.
Veamos como con la misma sintaxis, el software, a escogido distintos elementos.
# Escogiendo aleatoriamente 5 elementos.
sample(x=1:10, size = 5)
## [1] 6 1 8 2 4
Entonces si queremos corregir esto y queremos guardar los resultados y que al volver a correr toda la sintaxis arroje los mismos resultados, tendremos que usar una semilla. En R, colocar una semilla a un proceso aleatorio se realiza usando la función set.seed()
, que toma como argumento cualquier número (semilla).
Veamos un ejemplo. Vamos a ejecutar la misma sintaxis del ejemplo anterior pero usando una semilla.
set.seed(10)
sample(x=1:10, size = 5)
## [1] 9 7 8 6 3
Cuando usamos la semilla con valor de 10. Nos arroja como resultado los números: 9 8 7 6 y 3
10.
Veamos como sale el mismo resultado cuando volvemos a ejecutar la misma sintaxis.
set.seed(10)
sample(x=1:10, size = 5)
## [1] 9 7 8 6 3
En efecto, los resultados son los mismos. Con lo cual queda demostrado que si deseamos obtener los mismos resultados de un proceso aleatorio tendremos que usar una semilla.
Ahora veamos un ejemplo un poco más atractivo.
Vamos a seleccionar aleatoriamente 2 personas de un conjunto de 6 personas.
set.seed(12)
sample(x=c("LUIS","MARÍA","JUAN","ROBERTH","CARLOS","FLOR"), size = 2)
## [1] "MARÍA" "FLOR"
El software escogió a MARÍA Y FLOR
. Este ejemplo se desarrollo con el fin de poder ver un ejemplo en donde el vector universal es un vector de elementos caracter. Ahora veamos un ejemplo usando el argumento replace
.
Vamos a generar un vector de 20 elementos en donde se escoga entre 1 y 0.
set.seed(20)
sample(x=c(0,1), size = 20, replace = TRUE)
## [1] 1 0 0 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 1
Se ha escogido aleatoriamente 20 elementos que son 1 o 0
. Esto se pudo dar gracias al uso del argumento replace=TRUE
. Ya que si no se hubiera especificado que haya reemplazos, nos arojaría error ya que no se puede toma una muestra más grande que el vector universal cuandi replace toma el valor de FALSE
. Veamos este caso a continuación:
set.seed(20)
sample(x=c(0,1), size = 20)
## Error in sample.int(length(x), size, replace, prob): cannot take a sample larger than the population when 'replace = FALSE'
En efecto nos arroja un error, al correr el código.
Ahora veamos un ejemplo en donde se usa el argumento prob
. Vamos a escoger un vector que tenga 100 elementos entre hombres y mujeres, pero queremos que la proporción de hombres sea del 30% y de mujeres del 70%, aproximadamente.
Primero ejecutemos el problema sin especificar la proporción de hombres y mujeres.
set.seed(1805)
<-sample(x=c("HOMBRE", "MUJER"), size = 100, replace = T)
sexo sexo
## [1] "HOMBRE" "HOMBRE" "HOMBRE" "HOMBRE" "MUJER" "MUJER" "HOMBRE" "HOMBRE"
## [9] "MUJER" "MUJER" "HOMBRE" "MUJER" "MUJER" "MUJER" "HOMBRE" "HOMBRE"
## [17] "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "HOMBRE"
## [25] "HOMBRE" "MUJER" "HOMBRE" "HOMBRE" "MUJER" "MUJER" "MUJER" "HOMBRE"
## [33] "HOMBRE" "HOMBRE" "HOMBRE" "MUJER" "MUJER" "MUJER" "MUJER" "HOMBRE"
## [41] "MUJER" "MUJER" "HOMBRE" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER"
## [49] "MUJER" "HOMBRE" "HOMBRE" "HOMBRE" "MUJER" "HOMBRE" "MUJER" "MUJER"
## [57] "HOMBRE" "HOMBRE" "HOMBRE" "HOMBRE" "HOMBRE" "HOMBRE" "MUJER" "MUJER"
## [65] "HOMBRE" "MUJER" "MUJER" "HOMBRE" "MUJER" "MUJER" "MUJER" "MUJER"
## [73] "HOMBRE" "HOMBRE" "MUJER" "HOMBRE" "MUJER" "MUJER" "MUJER" "MUJER"
## [81] "MUJER" "HOMBRE" "HOMBRE" "HOMBRE" "HOMBRE" "HOMBRE" "MUJER" "MUJER"
## [89] "HOMBRE" "MUJER" "MUJER" "MUJER" "HOMBRE" "HOMBRE" "HOMBRE" "MUJER"
## [97] "MUJER" "HOMBRE" "MUJER" "HOMBRE"
Estamos guardando los resultados en el vector sexo
. Si queremos saber cuántos son hombres y cuántos son mujeres usted podría contar uno por uno, pero esto resultaría muy tedioso, la forma más eficiente es ver los resultados en una tabla de valores absolutos. Para esto usamos la función table()
. Veamos el resultado a continuación.
table(sexo)
## sexo
## HOMBRE MUJER
## 45 55
El software escogió aleatoriamente 45 hombres y 55 mujeres. Para poder obtener estos resultados en valores relativos usamos la función prop.table()
.
prop.table(table(sexo))
## sexo
## HOMBRE MUJER
## 0.45 0.55
El 45% son hombres y el 55% son mujeres.
El problema en un inicio nos decia generar un vector de hombres y mujeres en donde el 30% sea hombres y el 70% mujeres. Entonces, para poder generar el vector deseado usaremos el argumento prob
.
set.seed(1805)
<-sample(x=c("HOMBRE", "MUJER"), size = 100, replace = T, prob = c(0.3,0.7))
sexo sexo
## [1] "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "HOMBRE" "HOMBRE"
## [9] "MUJER" "MUJER" "HOMBRE" "MUJER" "MUJER" "MUJER" "HOMBRE" "MUJER"
## [17] "HOMBRE" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER"
## [25] "MUJER" "MUJER" "MUJER" "MUJER" "HOMBRE" "MUJER" "MUJER" "MUJER"
## [33] "MUJER" "MUJER" "HOMBRE" "MUJER" "HOMBRE" "HOMBRE" "MUJER" "MUJER"
## [41] "HOMBRE" "MUJER" "HOMBRE" "MUJER" "MUJER" "HOMBRE" "MUJER" "HOMBRE"
## [49] "HOMBRE" "HOMBRE" "HOMBRE" "MUJER" "MUJER" "MUJER" "HOMBRE" "HOMBRE"
## [57] "HOMBRE" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "HOMBRE"
## [65] "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "MUJER" "HOMBRE"
## [73] "MUJER" "MUJER" "MUJER" "MUJER" "HOMBRE" "MUJER" "MUJER" "MUJER"
## [81] "MUJER" "HOMBRE" "MUJER" "HOMBRE" "HOMBRE" "MUJER" "MUJER" "HOMBRE"
## [89] "MUJER" "MUJER" "MUJER" "HOMBRE" "MUJER" "MUJER" "HOMBRE" "HOMBRE"
## [97] "MUJER" "MUJER" "MUJER" "MUJER"
Estamos usando la misma semilla, pero estamos especificando las probabilidades11, además, estamos guardando los resultados en el mismo vector sexo
(el vector se está reescribiendo). Veamos defrente en valores relativos la proporción de hombres y mujeres.
prop.table(table(sexo))
## sexo
## HOMBRE MUJER
## 0.29 0.71
El 29% son hombres y el 71% son mujeres. En efecto, gracias a especificar el vector de probabilidades de suceso de cada elemento del vector universal se ha podido obtener la proporción del 30% y 70% entre hombres y mujeres, aproximadamente.
4.1.1 Aplicación: Ley de grandes números.
Una de las leyes más importantes en la teoría de la probabilidad es la “ley de grandes números”. La cual nos dice que al aumentar el número de ensayos de un experimento, este tiende a la esperanza matemática de la variable aleatoria que se ha generado en el experimento.
Por ejemplo, vamos a definir a un experimento como el lanzamiento de una moneda. Asimismo, definiremos a la variable aleatoria como el número de caras que resulte del experimento. Es así que sí sale cara la variable aleatoria tomará el valor de 1 y si sale sello la variable aleatoria tomará el valor de 0.
Si sacamos la esperanza matemática de este experimento. Nos resultaría 1/2.
\[\text{Probabilidad de que salga cara} =1/2 \] \[\text{Probabilidad de que salga sello} =1/2 \]
\[\text{Esperanza matemática} =\frac{1}{2}*1+\frac{1}{2}*0 =\frac{1}{2}\]
Lo que implica que el porcentaje de caras será el 50% y el porcentaje de sellos el otro 50%.
Entonces, si nosotros desarrollamos el experimento un número pequeño de veces no nos saldrá necesariamente la mitad de veces cara y la otra mitad sello. Vamos hacer el experimento con 200 ensayos.
set.seed(2020)
<-sample(c("CARA","SELLO"), 200, T)
experimento
round(prop.table(table(experimento))*100,4)
## experimento
## CARA SELLO
## 46.5 53.5
Vemos que el porcentaje de caras es del 46.5% y el de sellos es de 53.5%. Pero por la ley de grandes números nosotros sabemos que al aumentar el número de ensayos el experimento tenderá a la esperanza matemática, es decir, 50% de caras y 50% de sellos.
Veamos el resultado cuando el número de ensayos es de 1000.
set.seed(2020)
<-sample(c("CARA","SELLO"), 1000, T)
experimento
round(prop.table(table(experimento))*100,4)
## experimento
## CARA SELLO
## 48.4 51.6
Con 1000 ensayos el porcentaje de caras es del 48.4% y el de sellos es de 51.6%. Se va acercando a la esperanza matemática. Veamos que resulta con 100000 de ensayos.
set.seed(2020)
<-sample(c("CARA","SELLO"), 100000, T)
experimento
round(prop.table(table(experimento))*100,4)
## experimento
## CARA SELLO
## 50.136 49.864
Con 100000 ensayos el porcentaje de caras es del 50.14% y el de sellos es de 49.86%. Ya casi es igual al valor de la esperanza matemática.
Por último, veamos que pasa si consideramos 1000000 ensayos.
set.seed(2020)
<-sample(c("CARA","SELLO"), 1000000, T)
experimento
round(prop.table(table(experimento))*100,4)
## experimento
## CARA SELLO
## 50.0036 49.9964
Con 1000000 ensayos el porcentaje de caras es del 50% y el de sellos es de 50%. Es así como hemos podido demostrar la ley de grandes números.
4.2 Vectores vacios y selección de elementos.
4.2.1 Vectores vacíos.
Hasta el momento hemos visto que un vector puede tener uno o más elementos. Pero también están los vectores que no tienen elementos y que son vacíos. A continuación veamos un ejemplo de un vector vacío.
# Vector vacio.
<-c() v1
v1
está vacío, pero que existe en memoría.
Estos vectores nos serán útiles cuando veamos el tema de ciclos y el tema de funciones. Por el momento es suficiente con saber de su existencia.
4.2.2 Seleción de elementos usando [].
Si nosotros necesitamos selecionar un elemento o un conjunto de elementos de un vector, tendremos que usar el operador []
. Veamos unos ejemplos.
# Creando un vector.
<-c(10,3,65,3,2,5,7,6,5,9,99,100,102,1,2,2,3,6,87,12,12,13)
x x
## [1] 10 3 65 3 2 5 7 6 5 9 99 100 102 1 2 2 3 6 87
## [20] 12 12 13
Hemos creado el vector x
. Si usted quiere seleccionar el elemento de posición 8, usted debería de hacer lo siguiente.
# Seleccionado el elemento de posición 8.
8] x[
## [1] 6
En efecto, nos ha selecionado el elemento 6 que corresponde al elemento de posición 8 contando de izquierda a derecha. Entonces, si queremos seleccionar o extraer elementos de un vector, primero se tiene que indicar el vector del cual se desea extraer el elemento o elementos luego abrir corchetes y colocar la posición del elementos y cerrar los corchetes.
Veamos otro ejemplo en donde se selecciona el elemento de posición 5.
# Seleccionado el elemento de posición 5.
5] x[
## [1] 2
Nos resulta el 2, si usted cuenta de izquierda a derecha el elemento de posición 5 es el elemento 2.
Hasta ahora hemos visto como extraer sólo un elemento, pero podemos seleccionar varios elementos, para esto usaremos vectores en vez de elementos dentro de los corchetes. A continuación un ejemplo.
# Seleccionado los elementos de posición 3 al 5.
3:5] x[
## [1] 65 3 2
En efecto, hemos seleccionado los elementos de posición 3, 4 y 5 que son 65, 3, 2. Entonces, si deseamos seleccionar varios elementos, usaremos la posición de estos, pero definido como un vector. Veamos un ejemplo adicional en donde se selecciona los elementos de posición 7, 12 y 4.
# Seleccionado los elementos de posición 7, 12 y 4.
c(7,12,4)] x[
## [1] 7 100 3
Hemos definido el vector de posiciones deseadas con c(7,12,4)
. Y nos ha resultado los elementos 7, 100, 3. Con esta especificación se espera que se haya comprendido claramente el uso de vectores dentro de los corchetes.
Pero si nosotros queremos seleccionar un conjunto de elementos pero indicando exclusión, es decir, indicando que no seleccione a uno o varios elementos, entonces usaremos el operador -
. Con esto le indicaremos que nos seleccione todo el vector a excepción de (-
). Veamos un ejemplo, en donde se desea seleccionar a todo el vector x
, pero a excepción del primer elemento.
# Seleccionado todo el vector x, a excepción, del elemento de posición 1.
-1] x[
## [1] 3 65 3 2 5 7 6 5 9 99 100 102 1 2 2 3 6 87 12
## [20] 12 13
En efecto, se ha selecionado todos los elemento del vector x
, pero sin considerar el primer elemento. Esta especifiación lo podemos proyectar para excluir a varios elementos. Veamos un ejemplo en donde se quiere excluir a los elementos de posición 6, 10 y 3.
# Seleccionar el vector x, a excepción, de los elementos de
# posición 6, 10 y 3.
-c(6,10,3)] x[
## [1] 10 3 3 2 7 6 5 99 100 102 1 2 2 3 6 87 12 12 13
El resultado es el deseado.
4.2.3 ¿Cómo saber cuántos elementos tiene un vector?
A veces, el vector a estudiar es un vector muy grande y no conocemos su dimensión (total de elementos). Entonces, para conocer el número de elementos de un vector usaremos la función length()
, que tiene sólo un argumento que es el objeto del cual se desea saber su dimensión. Veamos un ejemplo y conozcamos cuántos elementos tiene el vector x
.
# Para saber el número de elementos del vector x.
length(x)
## [1] 22
El software nos indica que el número de elementos del vector x
es de 22.
Asimismo, podemos usar esta función para seleccionar elementos (uniendo con lo visto anteriormente). Es así que si deseamos seleccionar el último elemento del vector x
, podemos usar la siguiente sintaxis.
# Seleccionado el último elemento del vector x.
length(x)] x[
## [1] 13
En efecto, hemos seleccionado el último elemento del vector x
. Por último, si queremos seleccionar los últimos 4 elementos.
# Seleccionado los últimos 4 elementos.
length(x)-3):length(x)] x[(
## [1] 87 12 12 13
Recordar que si deseamos seleccionar varios elementos, lo que tiene que estar dentro de los corchetes tiene que ser un vector, por eso colocamos (length(x)-3):length(x)
. La primera parte (length(x)-3)
hace referencia a inicio, es decir, desde que posición se desea seleccionar (22-3 = 19); la segunda parte length(x)
indica el final (22). Es así que seleccionará desde el elemento 19 al 22 (los 4 últimos elementos).
Usted puede pensar que es tedioso y podría ser más eficiente definir la sintaxis con los números, de esta manera x[19:22]
. Déjeme decirle, que tiene cierta razón, pero su opción sólo sería viable cuando conozca el número total de elementos y tenga un sólo vector. Cuando usted desee automatizar procesos y trabaje con muchos vectores y de una dimensión colosal (que es lo que día a día se encuentra en un centro de trabajo). Usted verá la importancia y le parecerá más factible la sintaxis que hemos usado. Por el momento, estamos realizando ejemplos muy básicos, en capítulos posteriores verá la importancia de este tipo de sintaxis.
Podría dejar el directorio de trabajo en esa ruta, pero si quisiera importar el archivo que deseo tendría que especificar la ruta del archivo y eso me demoraría más tiempo, ya que tendría que escribir la ruta completa cada vez que deseo cargar un archivo.↩︎
En ejemplos posteriores se mostrará como importar archivos desde otra ruta.↩︎