Chapter 2 VECTORES.
Uno de los objetos más importantes del entorno R son los vectores. Un vector en R es un objeto que agrupa a varios elementos, es algo muy similar a un conjunto. Gracias a ellos se pueden construir matrices, listas, data frame, etc. Lo que posibilita que se pueda hacer análisis de datos al más alto nivel. Por tanto, en las siguientes lineas se muestra como definir vectores, sus clases, y las funciones más importantes para poder obtener vectores y realizar operaciones matemáticas, lógicas y estadísticas.
2.1 Definición de un vector.
Para poder definir un vector se puede usar cualquiera de los tres operadores <-
, =
, ->
. En este libro, de aquí para adelante, para definir vectores usaremos el símbolo <-
.
Tambien es necesario la función c
que sirve para concatenar elementos (más adelante se verá a más detalle esta función). Con estas dos herramientas es suficiente para poder definir vectores.
2.2 Clases de vectores.
En R, al igual que en otros softwares los objetos son de distintas clases. Esto permite un orden a la hora de transformar o generar operaciones, ya que todo vector, no puede aceptar operaciones matemáticas, estadísticas o lógicas.
En la siguiente tabla se muestran las clases de vectores que se pueden usar en R.
CLASE DE VECTOR | QUE CONTIENE |
---|---|
Integer | Números enteros |
Numeric | Números reales |
Logical | Caracteres lógicos |
Character | Caracteres o Palabras |
Complex | Números complejos |
Como se mencionó anteriormente, para definir vectores usaremos el operador de definición <-
y la función c()
. esta función permite juntar elementos en un determinado objeto.
Para la clase de vectores Integer sólo permite elementos que sean números enteros. En el entorno R para definir un número entero es necesario agregar al número la letra L, como se muestra a continuación:
#Vector Integer - Números enteros.
<-c(1L,2L,3L,4L,5L,6L)
x<-c(1L,3L,5L,7L,9L,11L,13L) y
Se realizá la definición de los vectores x y y. En los cuales se hizo uso de <-
y c()
. Los resultados se muestran a continuación:
x
## [1] 1 2 3 4 5 6
y
## [1] 1 3 5 7 9 11 13
En efecto, podemos ver que x
vale 1, 2, 3, 4, 5, 6 y y
vale 1, 3, 5, 7, 9, 11, 13.
Con respecto a la clase de vectores Numeric estos adminten números reales. Es muy fácil definirlos, a continuación se muestra un ejemplo.
#Vector Numeric - Números reales.
<-c(1.3, pi, exp(1))
z<-c(sin(pi/4), log(45), tan(pi/3)) t
Podemos ver que los vectores z y t contienen números reales, en el caso del vector z está compuesto por 1.3, pi y el número de euler. Los resultados son los siguientes:
z
## [1] 1.300000 3.141593 2.718282
t
## [1] 0.7071068 3.8066625 1.7320508
Un caso especial y fundamental de los lenguajes de programación son los vectores lógicos, estos permiten que los procesos sean más rápidos y a la vez más intuitivos. Para el caso de estos vectores, sólo acepta como elementos a TRUE
y FALSE
. A continuación se muestra un ejemplo:
# Vector Logical - Caracteres lógicos.
<-c(TRUE,FALSE,FALSE,TRUE)
m<-c(T,F,F,T,T,T,F) p
Como se habrán podido dar cuenta no es necesario escribir las palabras completas (TRUE
o FALSE
) es suficiente con escribir sus iniciales. Para comprobarlo a continuación se muestran los resultados.
m
## [1] TRUE FALSE FALSE TRUE
p
## [1] TRUE FALSE FALSE TRUE TRUE TRUE FALSE
Si se desea crear vectores Character se tendrá que usar como elementos sólo palabras o caracteres. Estos vendrán especificados por las comillas ""
, un ejemplo se muestra a continuación:
# Vector Character - Palabras.
<-c("Luis", "María", "José")
p1<-c("12", "casa", "pi") p2
El vector p1
contiene nombres (palabras) y el vector p2
contiene los números 12 y pi, pero como se usó las comillas, R los considera como caracteres, adicionalmente tiene a la palabra casa.
p1
## [1] "Luis" "María" "José"
p2
## [1] "12" "casa" "pi"
Por último, los vectores complex sólo aceptan elementos que sean números complejos. Para definir un número complejo es necesario considerar el número imaginario i. A continuación se muestran uno ejemplo:
# Vector Complex - N?meros complejos.
<-c(1+2i, 4i, 3+6i) c1
El vector c1
contiene tres elementos, los cuales son números complejos. Los resultados son los siguientes:
c1
## [1] 1+2i 0+4i 3+6i
2.2.1 ¿Cómo saber si un objeto es un vector?
Para poder saber si un objeto es un vector, es necesario usar la función is.vector()
. Este nos arrojará los valores TRUE
(si es un vector) o FALSE
(si no es un vector). A continuación se muestran los resultados para algunos de los vectores que hemos definido antes:
is.vector(x)
## [1] TRUE
is.vector(z)
## [1] TRUE
is.vector(m)
## [1] TRUE
is.vector(p1)
## [1] TRUE
is.vector(c1)
## [1] TRUE
Como era de esperarse, todas las variables definidas, resultan ser vectores.
2.2.2 ¿Cómo saber de que clase es un vector?
Para conocer la clase, se tendrá que usar la función is.integer()
, is.numeric()
, is.logical()
, is.character()
y is.complex()
. Al igual que antes este arrojará TRUE
o FALSE
. A continuación se muestran unos ejemplos.
is.integer(x)
## [1] TRUE
is.numeric(x)
## [1] TRUE
is.logical(m)
## [1] TRUE
is.character(p1)
## [1] TRUE
is.complex(p1)
## [1] FALSE
Puede parecer algo confuso, pero usted se puede preguntar, por qué el vector x que fue definido como Integer también arroja como si fuera un vector Numeric. Esto es porque los números enteros están contenidos en los números reales, mejor dicho el conjunto de números enteros es un subconjuto del conjunto de los números reales.
2.2.3 ¿Qué pasa si defino un vector con distintas clases de elementos?
¿Qué clase de vector será si defino el siguiente vector?
<- c(12, "azul", 2+1i, pi)
vis.integer(v); is.numeric(v); is.logical(v); is.character(v); is.complex(v)
## [1] FALSE
## [1] FALSE
## [1] FALSE
## [1] TRUE
## [1] FALSE
Como se puede observar el vector fue definido como Character, porque existe una jerarquía de elementos. Si el vector contiene un elemento caracter considerará a los otros elementos como caracteres. Como se muestra a continuación:
v
## [1] "12" "azul" "2+1i" "3.14159265358979"
La jerarquía es la siguiente:
Character>Complex>Numeric>Integer>Logical
Entonces, si quitamos el elemento caracter el vector debe de convertirse en un vector complejo. Veamos:
<- c(12, 2+1i, pi)
vis.integer(v); is.numeric(v); is.logical(v); is.character(v); is.complex(v)
## [1] FALSE
## [1] FALSE
## [1] FALSE
## [1] FALSE
## [1] TRUE
En efecto, el vector es un vector complejo.
2.3 Número de elementos de un vector.
Si deseamos conocer el número de elementos o dimensión o tamaño que tiene un vector. Nosotros usaremos la función length()
. La cual nos permitirá conocer el número de elementos por los que está compuesto el vector. Veamos el siguiente ejemplo.
# Definimos el vector.
<-c(1,3,54,6,3,4,2,4,6,9,87,8,4,5,3,2,2,3,4,5,6,4,5,6,7,7,7)
wasu wasu
## [1] 1 3 54 6 3 4 2 4 6 9 87 8 4 5 3 2 2 3 4 5 6 4 5 6 7
## [26] 7 7
Y si deseamos saber cuántos elementos tiene el vector wasu
entonces:
length(wasu)
## [1] 27
El vector wasu
tiene 27 elementos.
Veamos un ejemplo adicional.
length(c("Marcos","Rocio",12,12,12,3434,5656,788,5,4, TRUE,F))
## [1] 12
El vector que acabamos de crear tiene 12 elementos.
2.4 Funciones para construir vectores más eficientemente.
2.4.1 Vectores de elementos consecutivos:
Para poder construir un vector de números consecutivos se necesitará el operador :
. Por ejemplo, si deseamos contruir la serie de números desde el 1 al 10, entonces la sintaxis sería la siguiente.
# Vector que tiene como elementos desde el 1 al 10.
<-1:10
x0 x0
## [1] 1 2 3 4 5 6 7 8 9 10
Otro ejemplo sencillo, podría ser si deseamos generar números consecutivos desde el 20 al 45.
# Vector que tiene elementos desde el 20 al 45.
<-20:45
x1 x1
## [1] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
## [26] 45
En efecto, se ha generado la serie de números consecutivos desde el 20 al 45.
2.4.2 Vectores con patrones:
También existen vectores en donde los elementos siguen cierto patrón, como una secuencia aritmética o patrónes recurrentes. Veremos 2 funciones importntísimas para crear vectores los cuales son rep()
y seq()
.
FUNCIÓN | GENERA |
---|---|
rep() | Repite elementos o vectores |
seq() | Elementos ordenados en progresión aritmética |
Veamos algunos ejemplos de uso.
2.4.2.1 Función rep().
Est función tiene la siguiente sintaxis:
# rep(x, ...)
Donde:
x
: Es el elemento o vector que se desea repetir.
...
6: Son otros argumentos como: times
, each
y length.out
.
Entonces, si deseamos construir un vector en donde se repita el 2
diez veces, podemos usar la siguiente sintaxis.
# Para repetir el 2 diez veces.
rep(x=2,times=10)
## [1] 2 2 2 2 2 2 2 2 2 2
Con la sintaxis anterior le indicamos a R que el elemento x=2
se repita times=10
veces.
Veamos otro ejemplo en donde el elemento Luis
se repita 8
veces.
# Para repetir "Luis" ocho veces.
rep("Luis",8)
## [1] "Luis" "Luis" "Luis" "Luis" "Luis" "Luis" "Luis" "Luis"
Usted habrá notado que en esta ocación he omitido colocar el nombre de los argumentos x
y times
dentro de la función. Esto se hace siempre y cuando se sepa el orden de los argumentos. Es así que sí sé que el primer argumento de la función rep()
es el elemento o vector que se desea repetir, entonces podría omitir de la sintaxis la x
. Esto es así porque el orden de los argumentos de la función rep()
es el siguiente:
rep(x, times = 1, length.out = NA, each = 1)
Como se ve, el primer argumento es x
, el segundo es times
, el tercero es length.out
y el cuarto es each
.
Veamos una situación en donde se coloca en orden inverso los argumentos. Por ejemplo queremos repetir el 8
cuatro veces.
# Estamos inviertiendo el orden intencionalmente.
rep(4, 8)
## [1] 4 4 4 4 4 4 4 4
Resultó que se repitió el elemento 4
ocho veces. Y no resulta lo que teníamos pensado el 8
cuatro veces.
Entonces, podemos usar el orden inverso siempre y cuando coloquemos los nombres de los argumentos. Por ejemplo:
rep(times=4, x=8)
## [1] 8 8 8 8
En efecto, ahora si conseguimos lo que hemos estado buscando, que el 8
se repita cuatro veces.
Entonces, como conclusión, si deseamos omitir el nombre de los argumentos debemos de asignar valores en el orden que fueron definidos.
Asimismo, otro detalle importante de las funciones es que los argumentos toman valores por defecto, por ejemplo el argumento times
toma el valor de 1
que se representa times=1
. Esto implica que si usted omite usar el argumento times
en su sintaxis, times
tomará el valor de 1
. Es decir, el elemento se repetirá 1 vez. Veamos el ejemplo.
# Omitimos especificar el argumento times.
rep(8)
## [1] 8
En efecto, el elemento 8
se ha repetido una vez, es decir, se mantiene el 8.
Es así que es muy importante conocer los valores que toman por defecto los argumentos de las funciones. Con el uso y el mayor expertiz que vaya ganando en el uso del software R, usted podrá omitir nombres de argumentos ya que sabrá la posición de estos.
Ahora veamos como podríamos hacer repetir vectores.
El argumento times
se usa cuando se quiere repetir todo el vector un número determinado de veces y each
cuando se requiere repetir los elementos del vector. A continuación se muestran unos ejemplos.
# Repetirir el vector 1,2,3,4,5 tres veces.
rep(1:5, times=3)
## [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
# Repetirir los elementos del vector 1,2,3,4,5 tres veces.
rep(1:5, each=3)
## [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
# Repetir los elementos del vector 1,2,3,4,5 tres veces y luego este nuevo vector dos veces.
rep(x0, each=3, times=2)
## [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9
## [26] 9 9 10 10 10 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7
## [51] 7 8 8 8 9 9 9 10 10 10
Para repetir Arbitrariamente los elementos del vector se usa la función concatenar c
y se indica la veces que se desea repetir cada elemento del vector. A continuación un ejemplo:
# Repetición arbitraria de elementos del vector 1,2,3,4,5,6
rep(1:6, times=c(3,0,1,0,4,2))
## [1] 1 1 1 3 5 5 5 5 6 6
Se repite el elemento 1 tres veces, el elemento 2 cero veces, el elemento 3 una vez, el elemento 4 cero veces, el elemento 5 cuatro veces y el elemento 6 dos veces.
La función rep()
también se puede usar para repetir el vector y especificar una determinada dimension. Con el argumento length.out
podemos indicar la dimensión o tamaño deseado del vector.
El siguiente es un ejemplo de este caso:
# Repetir los elementos del vector 1,2,3 dos veces.
# Pero la dimensión del vector resultante que sea de 5.
rep(1:3, each=2, length.out=5)
## [1] 1 1 2 2 3
Si no se hubiese especificado el argumento length.out
el vector tendría una dimensión de 6, pero como se especificó que sólo tenga una dimensión de 5. Sólo considero los elementos hasta llegar a una dimensión o tamaño de 5.
A continuación se muestra un ejemplo más, con el fin de aclarar dudas.
rep(1:10, each=5, length.out=3)
## [1] 1 1 1
Si no se hubiera especificado el argumento length.out
el vector tendría un tamaño de 50, pero gracias a la especificación de length.out
este sólo cuenta con un tamaño de 3.
2.4.2.2 Función seq().
Esta función tiene como fin que los elementos del vector aumenten o decrezcan en proporción a una razón aritmética. La sintaxis es la siguiente:
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)), length.out = NULL, along.with = NULL, ...)
Donde:
from
: Corresponde al número con el que empezará la progresión.
to
: Indica el último número de la progresión.
by
: Indica la razón aritmética.
length.out
: La dimensión que se desea que tenga el vector resultante.
along.with
: Con este argumento se le indica que tome la dimensión de otro objeto.
Un detalle importante de la función seq()
es que no se puede usar mmutuamente el argumento by
y el length.out
, es decir, no se puede usar los dos argumentos a la vez. Veremos ejemplos de aquello líneas mas abajo.
Veamos un ejemplo, en donde se desea tener un vector que parta del 1 y termine en 21 y que aumente de 2 en 2.
seq(1, 21, by=2)
## [1] 1 3 5 7 9 11 13 15 17 19 21
En efecto tenemos el vector de número impares desde el 1 al 21.
Ahora veamos un caso donde la progresión tenga una razón aritmética negativa. Para este caso el from
tiene que ser más grande que el to
ya que la progresión es decreciente.
seq(40, 3, by=-4)
## [1] 40 36 32 28 24 20 16 12 8 4
En efecto, tenemos los números del 40 al 4 que decrecen de 4 en 4. El último elemento no es el 3, ya que el 3 queda fuera de la progresión aritmética, es decir, el valor de 4 es el mínimo elemento que se puede obtener en esta serie si la razón decrece de 4 en 4.
Si deseamos tener una determinada dimensión y omitir la razón se tendrá que especificar el argumento length.out
. Ya que con esto le indicamos a R que calcule la razón aritmética, ya que nosotros deseamos que la secuencia tenga un determinado número de elementos.
A continuación veamos un ejemplo.
# El vector empezará de 1 y terminará en 50
# y tendrá una dimensión de 10.
seq(1,50, length.out=10)
## [1] 1.000000 6.444444 11.888889 17.333333 22.777778 28.222222 33.666667
## [8] 39.111111 44.555556 50.000000
En efecto, al no asignarle la razón aritmética (by
). El software ha calculado un by
ya que nosotros le indicamos un tamaño específico.
También podemos usar el tamaño de otros objetos para poder indicar en la función seq()
la dimensión deseada. Para esto tenemos que usar el argumento along.with
.
Veamos un ejemplo a continuación.
# Definimos el vector a:
<-c(1,4,67,8) # El vector a tiene 4 elementos.
a
# Entonces si queremos tener un vector de 4 elementos.
seq(1,10, along.with = a)
## [1] 1 4 7 10
En efecto, tenemos un vector de 4 elementos que parte desde 1 y termina en 10.
Por último, veremos el caso en donde sólo especificamos el from
pero no el to
y ningún otro argumento adicional.
R nos dice en la documentación de la función seq()
que si sólo usamos el argumento from
entonces devolverá una secuencia de números consecutivos desde el 1 hasta el número especificado en el from, es decir, 1:from
. El software incluso recomienda usar la función seq_len()
7 en detrimento de seq()
si se desea obtener estos resultados.
The fifth form generates the sequence 1, 2, …, length(from) (as if argument along.with had been specified), unless the argument is numeric of length 1 when it is interpreted as 1:from (even for seq(0) for compatibility with S). Using either seq_along or seq_len is much preferred (unless strict S compatibility is essential).
Para más detalle puede revisar la documentación de la función ?seq
.
2.5 Concatenar elementos y vectores.
Para concatenar elementos, como se explicó antes, se usa la función c()
, asimismo, si deseamos concatenar vectores con elementos tambipen se usará c()
.
En el siguiente ejemplo se puede observar este procedimiento:
# Se define el vector t2.
<-seq(1, 20, by=3)
t2 t2
## [1] 1 4 7 10 13 16 19
Primero definimos el vector t2
. Ahora, si deseamos agregar el número 0
como primer elemento del vector t2
, lo haríamos de la siguiente manera.
# Agregando el cero al inicio del vector t2.
<-c(0,t2)
t2 t2
## [1] 0 1 4 7 10 13 16 19
En efecto, se ha podido agregar el 0
al inicio del vector t2
. Ahora si deseamos agregar dos elementos y estos que están al final del vector t2
. Haríamos como sigue.
# Si se desea agregar dos elementos al final del vector.
<-c(t2, 20, 21)
t2 t2
## [1] 0 1 4 7 10 13 16 19 20 21
Se ha agregado el 20
y 21
al final del vector t2
. Entonces, si deseamos agregar elementos a un vector entonces usando la función c()
podremos conseguir este objetivo.
Como último caso, mostramos como concatenar dos vectores.
# Definimos 2 vectores. El vector "x" y "z"
<-c(1,4,6)
x<-c(3,10,12) z
Si deseamos concatenarlos tendremos que usar la función c()
.
<-c(x,z)
t3 t3
## [1] 1 4 6 3 10 12
En efecto, se han unido los dos vectores y se ha generado el vector t3
que contiene a x
y z
.
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.↩︎