Protocolo:

1 Vectores en R:

El vector es una estructura de datos básica en R. Contiene elementos del mismo tipo. Los tipos de datos pueden ser lógicos, enteros, dobles, caracteres, complejos o raw.

1.1 Nota: funciones utiles:

  1. El tipo de un vector se puede comprobar con la función typeof().

  2. Otra propiedad importante de un vector es su longitud. Es el número de elementos del vector y puede comprobarse con la función length().

2 ¿Como Crear un vector en R?:

Los vectores generalmente se crean usando la función c().

Dado que un vector debe tener elementos del mismo tipo, esta función intentará coaccionar elementos del mismo tipo, si son diferentes.

La coerción (Explicado en la Publicación de RPubs Coerción) (o en el replit en la carpeta coercion esta explicada) es de tipos más bajos a más altos, de lógico a entero, a doble a carácter.

A grandes rasgos la Coerción es: En R, los datos pueden ser coercionados, es decir, forzados, para transformarlos de un tipo a otro. La coerción es muy importante. Cuando pedimos a R ejecutar una operación, intentará coercionar de manera implícita, sin avisarnos, los datos de su tipo original al tipo correcto que permita realizarla.

# Crear un vector pseudo-aletorio y probar su tipo:
message("\n# Crear un vector pseudo-aletorio y probar su tipo:")
## 
## # Crear un vector pseudo-aletorio y probar su tipo:
v <- runif(5, min = 0, max = 10)
print(v)
## [1] 9.533395 5.041862 6.307025 6.978378 5.523269
# Recordemos que double, se refiere a decimal:
message("\nRecordemos que double, se refiere a decimal:")
## 
## Recordemos que double, se refiere a decimal:
print(typeof(v))
## [1] "double"
# Verifiquemos su Tamaño con length:
message("\n# Verifiquemos su Tamaño con length:")
## 
## # Verifiquemos su Tamaño con length:
print(length(v))
## [1] 5
## Veamos un ejemplo de coerción implicita de R:
message("\n## Veamos un ejemplo de coerción implicita de R:")
## 
## ## Veamos un ejemplo de coerción implicita de R:
## Definimos un vector
message("\n## Definimos un vector")
## 
## ## Definimos un vector
u <- c(22L,124.1241, "Daniel Villa", FALSE)
cat("u <- ",u, sep = "  ")
## u <-   22  124.1241  Daniel Villa  FALSE
## Vamos a ver que los valores de cada item son diferentes, pero al evaluar u, R coerciona a un tipo de dato:
message("\nVamos a ver que los tipos de datos de cada item son diferentes, pero al evaluar u, R coerciona a un tipo de dato:")
## 
## Vamos a ver que los tipos de datos de cada item son diferentes, pero al evaluar u, R coerciona a un tipo de dato:
cat("typeof(u) =",typeof(u))
## typeof(u) = character

Si queremos crear un vector de números consecutivos, el operador : es muy útil.

2.1 Ejemplo:

# Creamos un vector solamente con el operador ":"
message("\n# Creamos un vector solamente con el operador \":\"")
## 
## # Creamos un vector solamente con el operador ":"
x <- 1:10
cat("x <- min:max")
## x <- min:max
cat("\nEjemplo = ", "x <- 1:10\n")
## 
## Ejemplo =  x <- 1:10
cat("x = ", x, sep = "  ")
## x =   1  2  3  4  5  6  7  8  9  10
## Ahora con numeros negativos:
message("\n## Ahora con numeros negativos:")
## 
## ## Ahora con numeros negativos:
y <- 5:-5
cat("\nEjemplo = ", "y <- 5:-5\n")
## 
## Ejemplo =  y <- 5:-5
cat("y = ", y, sep = "  ")
## y =   5  4  3  2  1  0  -1  -2  -3  -4  -5

Se pueden crear secuencias más complejas usando la función seq(), como definir el número de puntos en un intervalo o el tamaño del paso.

# Crear uuna secuencia mas compleja con seq():
message("\n# Crear uuna secuencia mas compleja con seq():")
## 
## # Crear uuna secuencia mas compleja con seq():
s = seq (1, 3, by = 0.02) # by <=> especificar el tamaño del paso 

cat("\nseq (1, 3, by = 0.02)")
## 
## seq (1, 3, by = 0.02)
cat("Un vector s, especificando que va dando pasos e 0.02 :\n", "s = ", s, sep = "  ")
## Un vector s, especificando que va dando pasos e 0.02 :
##   s =   1  1.02  1.04  1.06  1.08  1.1  1.12  1.14  1.16  1.18  1.2  1.22  1.24  1.26  1.28  1.3  1.32  1.34  1.36  1.38  1.4  1.42  1.44  1.46  1.48  1.5  1.52  1.54  1.56  1.58  1.6  1.62  1.64  1.66  1.68  1.7  1.72  1.74  1.76  1.78  1.8  1.82  1.84  1.86  1.88  1.9  1.92  1.94  1.96  1.98  2  2.02  2.04  2.06  2.08  2.1  2.12  2.14  2.16  2.18  2.2  2.22  2.24  2.26  2.28  2.3  2.32  2.34  2.36  2.38  2.4  2.42  2.44  2.46  2.48  2.5  2.52  2.54  2.56  2.58  2.6  2.62  2.64  2.66  2.68  2.7  2.72  2.74  2.76  2.78  2.8  2.82  2.84  2.86  2.88  2.9  2.92  2.94  2.96  2.98  3
sl = seq (1, 10, length.out = 4) # especificar la longitud del vector 

cat("seq (1, 10, length.out = 4)")
## seq (1, 10, length.out = 4)
cat("\nUn vector sl, especificando la longitud deseada del vector:\n", "sl = ", sl, sep = "  ")
## 
## Un vector sl, especificando la longitud deseada del vector:
##   sl =   1  4  7  10

3 ¿Cómo acceder a los elementos de un vector?

Se puede acceder a los elementos de un vector mediante la indexación vectorial. El vector utilizado para la indexación puede ser lógico, entero o de caracteres.

NOTA: R empieza en 1: El índice de los vectores en R empieza en 1, a diferencia de la mayoría de los lenguajes de programación donde el índice empieza en 0.

3.1 Usando un vector entero como índice:

  • Podemos utilizar un vector de enteros como índice para acceder a elementos específicos.

  • También podemos usar enteros negativos para retornar todos los elementos excepto los especificados.

  • Pero no podemos mezclar enteros positivos y negativos al indexar y los números reales, si se usan, se truncan a enteros.

3.1.1 Ejemplo:

# Usando un vector entero como índice:
message("\n# Usando un vector entero como índice:")
## 
## # Usando un vector entero como índice:
Vint <- sample(-20:20, size = 9, replace = TRUE)
cat("\nVint = ", Vint)
## 
## Vint =  14 2 -13 11 -7 -6 -3 3 -5
# Acedeamos a los elemntos:
message("\n# Acedeamos a los elemntos:")
## 
## # Acedeamos a los elemntos:
#  Accedientdo al 2 elemento:
print("#  Accedientdo al 2 elemento")
## [1] "#  Accedientdo al 2 elemento"
Vint[2]
## [1] 2
# Accediendo al 1er y 4to elemento
print("# Accediendo al 1er y 4to elemento")
## [1] "# Accediendo al 1er y 4to elemento"
Vint[1:4]
## [1]  14   2 -13  11
# Acceder a todos los elementos menos el 1er elemento:
print("# Acceder a todos los elementos menos el 1er elemento:")
## [1] "# Acceder a todos los elementos menos el 1er elemento:"
Vint[-1]
## [1]   2 -13  11  -7  -6  -3   3  -5
# no puede mezclar enteros positivos y negativos:
message("\n# no puede mezclar enteros positivos y negativos:")
## 
## # no puede mezclar enteros positivos y negativos:
cat("\n> Vint[c(2,-4)]", "\nOUTPUT:\n","> Error in Vint[c(2, -4)]: solamente 0's pueden ser mezclados con subscritos negativos")
## 
## > Vint[c(2,-4)] 
## OUTPUT:
##  > Error in Vint[c(2, -4)]: solamente 0's pueden ser mezclados con subscritos negativos
# los números reales se truncan en enteros:
message("\n# los números reales se truncan en enteros:")
## 
## # los números reales se truncan en enteros:
cat("Vint[c(1.4, 5.13)] = ", Vint[c(1.4, 5.13)])
## Vint[c(1.4, 5.13)] =  14 -7
cat("\nEs decir, por cada double or float del vector dentro de los [] saldra un valor truncado del vector utilizado, en este caso Vint")
## 
## Es decir, por cada double or float del vector dentro de los [] saldra un valor truncado del vector utilizado, en este caso Vint

3.2 Usando vector lógico como índice:

Cuando usamos un vector lógico para indexar, se retorna la posición donde el vector lógico es TRUE.

Esta útil característica nos ayuda en el filtrado del vector como se muestra a continuación:

3.2.1 Ejemplo:

#Retomando el vector anterior, pero lo renombraremos como Vlog.
message("\nRetomando el vector anterior, pero lo renombraremos como Vlog.")
## 
## Retomando el vector anterior, pero lo renombraremos como Vlog.
Vlog = Vint
print(Vlog)
## [1]  14   2 -13  11  -7  -6  -3   3  -5
cat("\nSize de Vlog = ", length(Vlog))
## 
## Size de Vlog =  9
## Probemos con un vecto logico:
message("\n## Probemos con un vecto logico:")
## 
## ## Probemos con un vecto logico:
cat("Vlog[c(TRUE, TRUE, FALSE, TRUE, FALSE)] = ", Vlog[c(TRUE, TRUE, FALSE, TRUE, FALSE)])
## Vlog[c(TRUE, TRUE, FALSE, TRUE, FALSE)] =  14 2 11 -6 -3 -5
## filtrar vectores basados en condiciones:
message("\n## filtrar vectores basados en condiciones:")
## 
## ## filtrar vectores basados en condiciones:
cat("\nVlog[Vlog > -10] <=>", Vlog[Vlog > -10])
## 
## Vlog[Vlog > -10] <=> 14 2 11 -7 -6 -3 3 -5
if(Vlog[Vlog < 0] == c(0)){
  cat("\nVlog[Vlog < 0] <=>","NO contengo datos menores a 0")

}else{
  cat("\nVlog[Vlog < 0] <=>",Vlog[Vlog < 0])
}
## 
## Vlog[Vlog < 0] <=> -13 -7 -6 -3 -5

En el ejemplo anterior, la expresión x>0 producirá un vector lógico (FALSE, FALSE, FALSE, TRUE) que luego se usa para indexar y dar el valor del vector que cumple la condición.

3.3 Usando vector de caracteres como índice:

Este tipo de indexación es útil cuando se trata de vectores con nombre. Podemos nombrar cada elemento de un vector.

# Definimos un vector con indice:
message("\n# Definimos un vector con indice:")
## 
## # Definimos un vector con indice:
print("No es necesario definir el numero == nombre, simplemente es una etiqueta")
## [1] "No es necesario definir el numero == nombre, simplemente es una etiqueta"
vnom <- c("Primero"= 1, "Tercero"= 3, "Cualiesquiera n"= 12342)
cat("\nvnom <- c(\"Primero\"= 1, \"Tercero\"= 3, \"Cualiesquiera n\"= 12342)")
## 
## vnom <- c("Primero"= 1, "Tercero"= 3, "Cualiesquiera n"= 12342)
# Imprimirmos nuestro vector:
message("\n# Imprimirmos nuestro vector:")
## 
## # Imprimirmos nuestro vector:
cat("vnom <-", vnom, sep = "  ")
## vnom <-  1  3  12342
# Imprimimos los nombres de vnom:
message("\n# Imprimimos los nombres de vnom:")
## 
## # Imprimimos los nombres de vnom:
names(vnom)
## [1] "Primero"         "Tercero"         "Cualiesquiera n"
print("Llamamos a un valor de vnom con el nombre asignado")
## [1] "Llamamos a un valor de vnom con el nombre asignado"
cat("vnom[\"Primero\"]", vnom["Primero"])
## vnom["Primero"] 1
# Recorramos los nombre del vectro con un for:

print("Recorramos los nombre del vectro con un for")
## [1] "Recorramos los nombre del vectro con un for"
for (x in names(vnom)) {
  cat("\n",paste0("vnom[",x,"]"), "<-",vnom[x])
}
## 
##  vnom[Primero] <- 1
##  vnom[Tercero] <- 3
##  vnom[Cualiesquiera n] <- 12342

4 ¿Cómo modificar un vector en R?:

Podemos modificar un vector usando el operador de asignación.

Podemos utilizar las técnicas comentadas anteriormente para acceder a elementos específicos y modificarlos.

Si queremos truncar los elementos, podemos utilizar reasignaciones.

# Definimos un vector:
print("# Definimos un vector:")
## [1] "# Definimos un vector:"
print("vx <- -10:15")
## [1] "vx <- -10:15"
vx <- -10:15
cat("vx <- ", vx, sep = "  ")
## vx <-   -10  -9  -8  -7  -6  -5  -4  -3  -2  -1  0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
## Modifiquemos algún valor:
message("\n## Modifiquemos algún valor:")
## 
## ## Modifiquemos algún valor:
a = sample(1:26, size = 1, replace = TRUE)
b = sample(1:26, size = 1, replace = TRUE)
vx[a] <- b

cat(paste0("vx[",a,"]"), paste0("<- ", b))
## vx[22] <- 21
## Veamos como modifico nuestro vector:
message("\n## Veamos como modifico nuestro vector:")
## 
## ## Veamos como modifico nuestro vector:
cat("vx <- ", vx, sep = "  ")
## vx <-   -10  -9  -8  -7  -6  -5  -4  -3  -2  -1  0  1  2  3  4  5  6  7  8  9  10  21  12  13  14  15
## Modificando elementos menores o mayores que:
message("\n## Modificando elementos menores o mayores que:")
## 
## ## Modificando elementos menores o mayores que:
vx[vx < 0] <- 5

cat("vx[vx < 0]", paste0("<- ", 5))
## vx[vx < 0] <- 5
## Veamos como modifico nuestro vector:
message("\n## Veamos como modifico nuestro vector:")
## 
## ## Veamos como modifico nuestro vector:
cat("vx <- ", vx, sep = "  ")
## vx <-   5  5  5  5  5  5  5  5  5  5  0  1  2  3  4  5  6  7  8  9  10  21  12  13  14  15
## truncar x a los 4 primeros elementos:
message("\n## truncar x a los 4 primeros elementos:")
## 
## ## truncar x a los 4 primeros elementos:
vx <- vx[1:4]
## Veamos como modifico nuestro vector:
message("\n## Veamos como modifico nuestro vector:")
## 
## ## Veamos como modifico nuestro vector:
cat("vx <- ", vx, sep = "  ")
## vx <-   5  5  5  5

5 ¿Cómo eliminar un vector?:

Podemos eliminar un vector simplemente asignándole un NULL.

# Definimos un vector:
print("# Definimos un vector:")
## [1] "# Definimos un vector:"
print("vx <- -10:15")
## [1] "vx <- -10:15"
cat("vx <- ", vx, sep = "  ")
## vx <-   5  5  5  5
## Creamos una copia:
message("\n## Creamos una copia:")
## 
## ## Creamos una copia:
vx = x

x <- NULL

print(x)
## NULL
print("Tambien lo podemos elimar con rm()")
## [1] "Tambien lo podemos elimar con rm()"
vx = x # volverla a definir para asignar denuevo valores

rm(x)