Introducción a las funciones básicas de R: Funciones con Vectores

¿Qué es R?
Es un software de alto rendimiento que se está convirtiendo en la alternativa gratuita a muchos softwares de programación para lidiar con matrices y bases de datos de amplia magnitud. R compite con Matlab, SPSS, STATA, entre otros que están destinados a trabajar con líneas de comandos en lugar de ventanas desplegables para ejecutar funciones. La principal ventaja que tiene R con respecto a esos otros programas es que es gratis y sus complementos conforman una amplia lista que se extiende a aplicaciones a muchas ramas de las ciencias, principalmente a las matemáticas, estadísticas y econometría que en nuestro caso es lo que interesa, todos estos complementos también son completamente gratuitos y muy documentados.
R es un conjunto integrado de programas para manipulación de datos, cálculo y gráficos. Entre otras características dispone de:
  • almacenamiento y manipulación efectiva de datos,
  • operadores para cálculo sobre variables indexadas (Arrays), en particular matrices,
  • una amplia, coherente e integrada colección de herramientas para análisis de datos,
  • posibilidades gráficas para análisis de datos, que funcionan directamente sobre pantalla
    o impresora, y
  • un lenguaje de programación bien desarrollado, simple y efectivo, que incluye
    condicionales, ciclos, funciones recursivas y posibilidad de entradas y salidas. [R Development Core Team, 2000]
¿Qué no es R?
  • R no es sólo un lenguaje de programación como C++, Visual Basic, Java, etc.
  • No es un generador de gráficos interactivos como Matlab’s UI.
  • No es un programa de clicar y ejecutar como SPSS, Statistica, Eviews o StatgraphicsPLUS.
¿Cómo debe ser entendido R?
  • Es un lenguaje de alto nivel para la gestión y almacenamiento de datos.
  • Lenguaje con gran colección de funciones predefinidas para operaciones matriciales.
  • Generador de gráficos de alta calidad.
  • Lenguaje de programación de sintaxis estricta, similar a Matlab en este sentido.
¿Cómo obtener R?
El software puede descargarse gratuitamente de la siguiente dirección http://www.r-project.org/ y todos los complementos necesarios así como sus respetivos manuales de referencia se pueden obtener de The Comprehensive R Archive Network (CRAN)cuya dirección es http://cran.r-project.org/, luego cuando sea el momento se indicará como descargar los paquetes de complementos de R directamente desde el programa y cómo cargarlos para su ejecución.

Trabajando con Vectores en R

Todos los ejemplos que se describirán a continuación se pueden escribir directamente en la pantalla principal de R y para ejecutarlos basta con presionar enter al finalizar la línea de comandos, pero yo prefiero usar un Nuevo Script y para ello se hace clic en Archivo y seleccionar Nuevo Script, para ejecutar una línea de comandos desde un Script se debe usar Ctrl + r.

Concatenate function: c()

Existen muchas maneras para crear un vector en R. Vamos a crear un vector y a nombrarlo vec, vamos a usar la función concatenate para hacer una lista de números ordenados:
vec1 <- c( -2.5, -2.3, -1.85, -1.20, 0, 0.1, 0.85, 1.20, 1.70, 1.95, 2.45 )
vec1 ←┘ #para ver el resultado o vec1 Ctrl + r si se está trabajando desde un script
Este vector tendrá la siguiente apariencia:
  [1] -2.50 -2.30 -1.85 -1.20  0.00  0.10  0.85  1.20  1.70  1.95  2.45
Estas sólo son unas notas introductorias al uso de esta función, si se desea más información diríjase al sitio web oficial de R sobre ayuda y definición de esta función haciendo clic aquí.

Assignment operator

El operador “<- “ se llama operador de asignación y su función es asignar un resultado, función, o cualquier objeto creado en R a un nombre específico con el objetivo de guardarlo con ese nombre y luego recuperarlo simplemente escribiendo el nombre donde lo hemos asignado, el operador “=” hace lo mismo que “<-“  y que “->”.  
Si se desea asignar y ver los resultados al mismo tiempo se tiene que escribir toda la línea entre paréntesis.
(vec1 <- c( -2.5, -2.3, -1.85, -1.20, 0, 0.1, 0.85, 1.20, 1.70, 1.95, 2.45 ))


Colon operator, ":"

Se puede utilizar también el operador “:” para generar una secuencia de números, con este comando sólo se controla el punto de inicio y el fin de la secuencia,  por ejemplo, vamos a crear un vector que inicie en –2 y acabe en 2, para ello se utilizaría el operador ":" por defecto este operador separa cada cantidad numérica por una unidad, es decir, creará la secuencia siguiente, –2, –1, 0, 1, 2
vec2 <- -2:2   #cuyo resultado es      [1] -2 -1  0  1  2

Función Seq() 

Si el interés es crear una secuencia de números controlando el intervalo de separación, el punto de inicio de la secuencia y el punto de finalización convendría más usar la función seq cuya sintaxis es seq(from=_, to=_, by=_) donde seq es el comando para ejecutar la función “crear secuencia”, from indica el punto de inicio de la secuencia, to indica el valor final de la secuencia y by indica el valor por el cual se separará cada número con respecto a anterior y al siguiente (valor de incremento), por defecto ese es el orden del comando por lo cual no es necesario escribir explícitamente los nombres de los argumentos, si escribimos seq(1,10,1) el programa entenderá que se desea una secuencia que inicie en 1 y acabe en 10 y cada valor sea separado por incrementos unitarios, es decir, con esto se crearía una secuencia consecutiva de valores desde 1 hasta 10.
vec3<-seq(1,10,1)   #cuyo resultado sería
 [1]  1  2  3  4  5  6  7  8  9 10
Podemos incluso ejecutar una secuencia hacia decreciente, para ello hay que usar un valor de incremento negativo.
En el ejemplo anterior, sería lo mismo si hubiésemos escrito seq(from=1, to=10, by=1) esto generaría el mismo vector, el programa también entiende que si se cambia el orden pero se escribe explícitamente el nombre de cada argumento generará el vector que deseamos, es decir, el resultado de la siguiente orden  seq(from=1, to=10, by=1) es exactamente igual al resultado de esta otra seq(from=1, by=1, to=10), o cualquier otra combinación dará como resultado el mismo vector siempre y cuando se escriban explícitamente los nombres de los argumentos. No es el caso si se escribe seq(1,10,1)  o  seq(1,1,10), es decir es el mismo ejemplo anterior pero suprimiendo los nombre de los argumentos (from, to, by) en este caso las secuencias no serán iguales, la primera será un vector con números consecutivos desde 1 hasta 10 y el segundo sólo será el escalar 1, ¿Por qué? Porque en el segundo caso la orden que está recibiendo el programa es crea un vector que inicie en 1 y acabe en 1 con separaciones de 1o entre cada uno de ellos, por lo cual como el punto inicial y el final es 1 el programa descarta el argumento de separación de 10 porque es imposible hacer tal cosa, por tanto sólo devuelve el valor del escalar 1, con esto queda en evidencia que hay que tener mucho cuidado cuando se va a trabajar con funciones sin escribir explícitamente los nombres de los argumentos, yo siempre recomiendo escribir los argumentos, toma un poco más de tiempo pero nos aseguramos que el resultado que obtenemos es el que queremos.
  

Otro ejemplo es
vec5 <- seq( -3.1, 2.2, by=0.1 )
[1] -3.1 -3.0 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3 -2.2 -2.1 -2.0 -1.9 -1.8 -1.7 -1.6
[17] -1.5 -1.4 -1.3 -1.2 -1.1 -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1  0.0
[33]  0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1.0  1.1  1.2  1.3  1.4  1.5  1.6
[49]  1.7  1.8  1.9  2.0  2.1  2.2

Note que al lado izquierdo, al comienzo de cada fila se proporcionan cuatro números entre corchetes [1], [17], [33] y [49], estos números indican la posición del primer número de cada fila en el vector que se ha generado, es decir el número –3.1 es el primero del vector, el número –1.5 está en la posición 17, el número 0.1 están en la posición 33 y el 1.7 está en la posición 49, es fácil deducir que en la posición 52 se encuentra el número 2.0 y también es fácil deducir que la longitud del vector es de 54, es decir, que el vector tiene 54 elementos, siendo el elemento de la posición 54 el número 2.2.

Función para transponer un vector o una matriz: t()

 Hasta aquí es importante señalar que todos los vectores que hemos creado con las distintas funciones son vectores columnas, para crear un vector fila, es necesario crear un vector columna y luego transponerlo, hacer esto es muy sencillo y sólo es necesario usar la función t().  La función t() sirve tanto para transponer vectores como matrices


Vamos a transponer el último vector que hemos creado, al cual hemos nombrado vec5, para hacerlo solo se debe escribir t(vec5)
vec5t <- t(vec5)
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
[1,] -3.1   -3 -2.9 -2.8 -2.7 -2.6 -2.5 -2.4 -2.3  -2.2  -2.1    -2  -1.9  -1.8
     [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27]
[1,]  -1.7  -1.6  -1.5  -1.4  -1.3  -1.2  -1.1    -1  -0.9  -0.8  -0.7  -0.6  -0.5
     [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37] [,38] [,39] [,40]
[1,]  -0.4  -0.3  -0.2  -0.1     0   0.1   0.2   0.3   0.4   0.5   0.6   0.7   0.8
     [,41] [,42] [,43] [,44] [,45] [,46] [,47] [,48] [,49] [,50] [,51] [,52] [,53]
[1,]   0.9     1   1.1   1.2   1.3   1.4   1.5   1.6   1.7   1.8   1.9     2   2.1
     [,54]
[1,]   2.2
En este otro caso los números entre corchetes indican la posición de cada elemento en el vector fila (puesto que se ha transpuesto un vector columna), ahora el número [1,] indica la fila en la que se encuentra el elemento y los números [,1], [,2],…, [,54] indican la columna en la que se encuentran dichos elementos, en este caso hemos transpuesto un vector de dimensión 54x1 por tanto tendremos como resultado un vector 1x54 y es precisamente eso lo que R nos proporciona.  Por ejemplo, el elemento en la posición [1,35] es el número 0.3 que se ha resaltado en amarillo, es donde se interceptan la fila 1 con la columna 35, formando el par [1,35]=0.3 . Para más información sobre esta función vaya al sitio web oficial de ayuda de R haciendo clic aquí.

Función Length ()

Una función que resulta muy útil para determinar la longitud de un vector (fila o columna) es la función length(). Ya se ha mencionado que el vector vec5 tiene una longitud de 54 elementos, esto se ha deducido porque en la posición 49 se encuentra el número 1.7, y hacen falta 5 números para llegar al último por lo cual el último número está en la posición 54 siendo esta la longitud del vector, que de hecho por ser un vector columna es de longitud 54 y de dimensión (54x1), pero no resulta del todo práctico obtener la longitud de un vector de esta manera, por lo cual hemos de usar la función length() y su uso se ilustra a continuación:
 length(vec5)
[1] 54

Y el resultado es 54 tal y como lo esperábamos.
Si desea tener más información sobre esa función haga clic aquí y será redireccionado al sitio oficial de R.

Función rep() 

Si lo que nos interesa es crear un vector de longitud 12 únicamente con 3 elementos: 1, 2, y 3 pero cada uno de ellos repetidos 4 veces, entonces es útil conocer la función rep() ya que esta crea un vector con valores repetidos. Vamos a crear el vector que hemos descrito anteriormente:
rep(c(1,2,3), each=4)
[1] 1 1 1 1 2 2 2 2 3 3 3 3
Tal y como se ha descrito se ha obtenido un vector con 12 elementos cada uno repetido 4 veces, se puede comprobar la longitud del vector usando length(rep(c(1,2,3), each=4)) lo que daría como resultado 12.
También se puede crear un vector con secuencia repetidas, por ejemplo, creamos una secuencia consecutiva desde el 1 al 4, y luego creamos un vector repitiendo la secuencia dos veces, observe que esta vez vamos a repetir la secuencia entera dos veces. Para lograr este cometido hemos de proceder de la siguiente manera:
1. Creamos la secuencia consecutiva desde 1 a 4 y la asignamos un nombre arbitrario, yo lo asignaré a la letra x
1:4->x # Los resultados de la secuencia guardada en x será:
[1] 1 2 3 4
2.Repetir esa secuencia dos veces.
rep(x, 2)
[1] 1 2 3 4 1 2 3 4
y así se crea un vector de secuencias repetidas dos veces, pero se pudo haber hecho todo en un solo paso, es decir, en lugar de crear primero el vector x y luego repetirlo, escribimos la secuencia directamente:  rep(1:4, 2)y así se obtiene el mismo resultado.
Podríamos también repetir cada elemento de la secuenca 1:4 dos veces, en lugar de repetir la secuencia entera dos veces como se ha hecho en el ejemplo anterior, esto se hace incluyendo el argumento “each=”
rep(1:4, each=2)
[1] 1 1 2 2 3 3 4 4
Incluso podríamos repetir tres veces la secuencia y en cada vez cada elemento se va a repetir dos veces, esto se logra así:
rep(1:4, each = 2, times = 3)
[1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4
Como se pude ver es muy flexible trabajar con la generación de vectores en R, estas sólo son unas notas introductorias y si se desea más información sobre la función rep se pude consultar directamente en el sitio oficial de R haciendo clic aquí

Suma y Resta de Vectores

Dos o más vectores pueden ser sumados utilizando el operador de suma tal y cual se usa en excel o en cualquier calculadora de mano, para sumar dos vectores primero hay que disponer de ellos, por el momento los crearemos. Crearemos tres vectores x, y  y z  de la siguiente manera:
x<-1:10;    y<-seq(from=10, to=1, by=-1);   z<-seq(from=1, to=5, length.out=10)
x [1]  1  2  3  4  5  6  7  8  9 10
y [1] 10  9  8  7  6  5  4  3  2  1
z [1] 1.000000 1.444444 1.888889 2.333333 2.777778 3.222222 3.666667 4.111111
[9] 4.555556 5.000000
Sumando los vectores x y y  
x+y 
[1] 11 11 11 11 11 11 11 11 11 11
Sumando los tres vectores
x+y+z
[1] 12.00000 12.44444 12.88889 13.33333 13.77778 14.22222 14.66667 15.11111
[9] 15.55556 16.00000

Restando z  del vector x
x-z
[1] 0.0000000 0.5555556 1.1111111 1.6666667 2.2222222 2.7777778 3.3333333
[8] 3.8888889 4.4444444 5.0000000


Multiplicación de Vectores

Hay dos formas de multiplicar vectores: la multiplicación elemento a elemento y la multiplicación definida por el álgebra matricial donde debe cumplirse la condición de conformabilidad  para la multiplicación donde el número de columnas del primero debe ser igual al número de filas del segundo, a continuación se hacen estas dos multiplicaciones:
Multiplicación elemento a elemento da como resultado un vector de igual dimensión que los anteriores.
x*y
 [1] 10 18 24 28 30 30 28 24 18 10

Por otro lado, como se ha señalado anteriormente también se pueden hacer productos de vectores siempre y cuando sean conformables, en este caso el producto matricial se indicará con los símbolos %*% y el producto elemento a elemento se indicará con el símbolo *, a continuación multiplicaremos el x con dimensión (10x1) por el vector x’ con dimensión (1x10) y dará como resultado la matriz de dimensión (10x10).
x%*%t(x)
   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    2    3    4    5    6    7    8    9    10
[2,]    2    4    6    8   10   12   14   16   18    20
[3,]    3    6    9   12   15   18   21   24   27    30
[4,]    4    8   12   16   20   24   28   32   36    40
[5,]    5   10   15   20   25   30   35   40   45    50
[6,]    6   12   18   24   30   36   42   48   54    60
[7,]    7   14   21   28   35   42   49   56   63    70
[8,]    8   16   24   32   40   48   56   64   72    80
[9,]    9   18   27   36   45   54   63   72   81    90
[10,]   10   20   30   40   50   60   70   80   90   100


Referencias

R Development Core Team (2000). Introducción a R. CRAN.R-Project
________________


                            ¿Ha sido de utilidad? ¿Ha sido claro? Deja tu comentario!                                                                                                         Jilber Urbina.

No hay comentarios:

Publicar un comentario