martes, 24 de marzo de 2009

R: Vectores

La estructura más simple de datos que es capaz de manejar R, son los llamados vectores, por ejemplo, la siguiente sentencia:

> a <- 1
> a
[1].1

Donde se la asigna a la variable 'a', el valor 1, es simplemente un vector de una dimensión, es decir, de un único elemento.

¿Y qué es un vector? Pues simplemente es una colección ordenada de números, y este capítulo intentará abordar de forma práctica como declarar y manejar vectores en R.

Para abordar el propósito que nos ataña en este capítulo, empezaremos exponiendo las distintas formas que nos provee R para declarar vectores.

Declaración de Vectores.

La forma más simple, es mediante la función c() que está definida en R, ésta es una función genérica que combina los argumentos que alberga para formar un vector. Para un conocimiento más amplio, buscar en la ayuda:

> ?"c"

Por ejemplo, queremos declarar un vector numérico llamado X1 que contengan los elementos: 1, 2, 3, 4 y 5. Usando la función anteriormente descrita, se declarará tal y como se indica a continuación:

> X1 <- c(1,2,3,4,5)

Corroboramos que realmente se ha declarado dicho vector:

> X1
[1].1.2.3.4.5

Y efectivamente, podemos observar que usando la función c(), podemos declarar vectores de una forma fácil y rápida. Hay otra forma que es equivalente a la función c(), y es usando la función assign(), para el mismo ejemplo que el usado anteriormente:

> assign("X1",c(1,2,3,4,5))
> X1

[1].1.2.3.4.5

Podemos ver, que el resultado es el mismo de una manera u otra, y llegados a este punto, ya sabemos declarar vectores, ahora bien, R pone a disposición del usuario herramientas bastantes poderosas para declarar vectores en forma de secuencias.

Una forma de declarar un vector que contenga elementos correlativos, por ejemplo, declarar un vector X1 que tengan los elementos 1, 2, 3, 4 y 5, sería:

> X1 <- 1:5
> X1

[1].1.2.3.4.5

De forma equivalente, podemos usar la función ya definida en R, denominada seq():

> X1 <- seq(1,5,by=1)
> X1

[1].1.2.3.4.5

La función seq() es bastante interesante y útil para declarar vectores, dispone de cinco argumentos, aunque no se utilizan todos a la vez. Si se dan los dos primeros indican el comienzo y el final de la sucesión, y si son los únicos argumentos, el resultado coincide con
el operador ':', es decir:

> seq(1,5)

Es equivalente a:

> 1:5

Los argumentos de seq(), y de muchas funciones de R, pueden darse además de por posición, por nombre, en cuyo caso, el orden en que aparecen es irrelevante. En dicha función, los dos primeros argumentos se pueden dar por nombre mediante: from=valor-inicial y to=valor-final, por tanto

> seq(1,5)

> seq(from=1, to=5).......# No se tiene en cuenta el orden por usarla por nombres

> seq(to=5, from=1).......# No se tiene en cuenta el orden por usarla por nombres

Son maneras equivalentes a:

> 1:5

Los dos siguientes argumentos de seq() son by=valor y length=valor, y quieren decir, el 'paso' y 'longitud' de la sucesión respectivamente. Si no se suministra ninguno, el valor predeterminado es by=1 y length se calcula de forma automática cuando se declare el vector.

Y el último argumento es, along=vector, y si se usa debe ser el único argumento, ya que crea una sucesión 1, 2, ..., length(vector), o la sucesión vacía si el vector es vacío (circunstancia que puede darse). Por ejemplo:

> r <- c(1,1:4)
> y <- seq(along = r)
> y

[1].1.2.3.4.5

Es decir, el argumento along=vector, crea una secuencia de números correlativos (sin repetir) hasta la longitud del vector. Para más información sobre la función seq():

> ?"seq"

Otra función importante y útil, de carácter parecido a seq(), es la llamada rep(). Ésta función duplica un objeto de forma diversas.

Los argumentos de rep(), al igual que seq(), pueden darse además de por posición, por nombre, en cuyo caso, el orden en que aparecen es irrelevante.

Dicha función, posee cuatro argumentos de los cuales, los tres últimos, se pueden dar por nombre mediante: times=número-de-veces-a-repetir-la-secuencia, each=número-de-veces-a-repetir-cada-elemento y len=longitud.

Por ejemplo, queremos repetir por cuatro veces el vector X1 definido anteriormente y almacenarlo en X2.

> X2 <- rep(X1, times=4)
> X2

[1].1.2.3.4.5.1.2.3.4.5.1.2.3.4.5.1.2.3.4.5

Y ahora, sólo queremos repetir dos veces cada elemento del vector X1 y almacenarlo en X2:

> X2 <- rep(X1, each = 2)
> X2

[1].1.1.2.2.3.3.4.4.5.5

Y por último, queremos repetir el vector X1 en X2 pero sólo con una longitud del mismo de 3 elementos:

> X2 <- rep(X1, len = 2)
> X2

[1].1.2

Como se puede observar, no es posible la repetición del vector X1 ya que está limitada la dimensión del vector X2 dos elementos. En resumen, esta función puede usar los cuatro argumentos simultáneamente si se requiere, por ejemplo:

> X2 <- rep(X1, times = 2, each = 2, len = 15)
> X2

[1].1.1.2.2.3.3.4.4.5.5.1.1.2.2.3

Para más información sobre la función rep():

> ?"rep"

Y para terminar y como resumen a este apartado de declaración de vectores, hacer hincapié en la función c(), la cual pude combinar distintas funciones en un sólo vector, por ejemplo, declarar un vector X3 que contenga la secuencia desde 1 hasta 5 y la secuencia desde a 1 hasta 2 con paso de 1:

> X3 <- c(1:5, seq(1,2, by=1))
> X3

[1].1.2.3.4.5.1.2

En definitiva, la función c() puede combinar múltiples posibilidades con las funciones que se han expuesto anteriormente y con otras, para crear un único vector.

Selección de Elementos de un Vector.

Al trabajar con vectores, es importante a veces, conocer el valor de un elemento concreto del vector. R, dispone a disposición del usuario cuatro tipos diferentes de acceder a un vector.

· La primera y más fácil, consiste en acceder a un elemento de un vector mediante un índice de números naturales, por ejemplo, tenemos el vector llamado T con los elementos 0, 2, 4, 6 y 8:

> T <- c(0,seq(2,8,by=2))
> T

[1].0.2.4.6.8

Y queremos acceder al elemento que está en la posición cuarta de dicho vector, es tan sencillo cómo:

> T[4]
[1].6

Y efectivamente, ése es el valor del elemento número cuatro del vector T.

· Otra forma de acceder de acceder a los elementos de un vector es mediante índices negativos, esto en R significa que se almacenarán o expondrán todos los elementos del vector menos los que marcan los índices negativos, por ejemplo, queremos acceder a todos los elementos del vector T, definido anteriormente, menos el elemento 4:

> T[-4]
[1].0.2.4.8

Se pude comprobar que es cierto, ésta forma no es única a un sólo índice, también podemos excluir varios elementos, por ejemplo, ni el elemento 1 ni el 4 del vector T:

> T[-c(1,4)]
[1].2.4.8

· También podremos acceder a los elementos de un vector con operadores lógicos, por ejemplo, queremos mostrar los elementos del vector T, previamente definido, de índice mayor que 4:

> T[T > 4]
[1].6.8

Podremos usar cualquier operación lógica con los índices de los vectores.

· Y por última opción, R nos provee de acceder a los elementos de un vector mediante caracteres o nombres, para ello, previamente el vector debe tener el atributo de nombre (names), por ejemplo, al vector definido T, le adjudicaremos los nombres: Manzanas, Naranjas, Ciruelas, Platanos y Uvas a los índices del vector T respectivamente.

> names(T) <- c("Manzanas", "Naranjas", "Ciruelas", "Platanos", "Uvas")
> T

Manzanas.Naranjas.Ciruelas.Platanos.Uvas
.......0...............2...............4............6..........8

Esta opción es bastante útil ya que es más fácil el recordar nombres que índices numéricos.

En resumen, R pone a disposición del usuario múltiples recursos de acceder a los elementos de un vector de forma sencilla y simple, eso sí, el índice con el cual queremos acceder a un elemento o elementos de un vector debe ser menor que la longitud total del vector, ya que si no, R nos informará que el elemento no está definido.

Por ejemplo, el vector T es de dimensión 5, por lo tanto si queremos acceder al elemento número 6:

> T[6]
NA

R nos dirá que dicho elemento no está definido.

Funciones Útiles Para el Manejo de Vectores.

Existen funciones bastantes útiles y fáciles de usar ya definidas en R cuando trabajemos con vectores, las más comunes se resumen en la siguiente tabla:

Los operadores aritméticos que podemos emplear en R, se detallan en la siguiente tabla.

Funciones Comunes con Vectores.
Función
Definición
Ejemplo
max(vector)Devuelve el elemento máximo
del vector.
> max(T)
[1].8
min(vector)
Devuelve el elemento mínimo
del vector.
> min(T)
[1].0
range(vector)
Devuelve el elemento mínimo
y máximo del vector.
> range(T)
[1].0.8
length(vector)Devuelve la dimensión
del vector.
> length(T)
[1].5
sum(vector)Devuelve la suma de todos
los elementos del vector.
> sum(T)
[1].20
prod(vector)Devuelve el producto de todos
los elementos del vector.
> prod(T)
[1].0
sort(vector)Devuelve los elementos ordenados
de forma creciente del vector.
>x<-c(1,5,2)
> sort(x)
[1].1.2.5

Las funciones mencionadas en la tabla anterior, no son las únicas y para tener más información de cada una de ellas, se recomienda que se consulte la ayuda que trae consigo R.

Vectores de Caracteres.

El programa R nos permite crear vectores de elementos de tipo carácter, una cadena de caracteres se crean escribiendo entre comillas la sucesión de caracteres que la define, por ejemplo, almacenar en un vector, Y1, la frase: "Hola Mundo".

> Y1 <- c("Hola Mundo")
> Y1
[1] "Hola Mundo"

Al igual que pasaba con los vectores numéricos, se pueden concatenar elementos de tipo carácter mediante la función c(). Por ejemplo, tenemos dos vectores, A1 y A2 que contienen los elementos Hola y Mundo respectivamente:

> A1 <- "Hola"
> A2 <- "Mundo"

Si queremos concatenar ambos vectores en uno sólo, debemos usar la función c() tal y como se muestra a continuación:

> c(A1,A2)
[1] "Hola".."Mundo"

Una función útil para vectores de tipo carácter, es paste(), une todos los vectores de caracteres que se le suministran y construye una sola cadena de caracteres.

También admite argumentos numéricos, que convierte inmediatamente en cadenas de caracteres. En su forma predeterminada, en la cadena final, cada argumento original se separa del siguiente por un espacio en blanco, aunque ello puede cambiarse utilizando el argumento sep="cadena", que sustituye el espacio en blanco por cadena, la cual podría ser incluso vacía. Por ejemplo:

> A3 <- paste(c("Hola","Mundo"), 1:5, sep="")
> A3
[1] "Hola1".."Mundo2".."Hola3".."Mundo4".."Hola5"

Se puede apreciar como funciona la función paste(), para más información, se recomienda que se utilice la ayuda integrada en el software.

En definitiva, R nos proporciona múltiples maneras de crear y manejar vectores, las expuestas en este capítulo son las más comunes y fáciles de usar.

0 comentarios: