Introducción al lenguaje R

TIplE MAnáDINe

El paquete R^{1} es una colección de programas libres^{2} diseñada para el análisis estadístico de datos, que permite desde los análisis descriptivos más sencillos (como tablas de frecuencias simples) a procedimientos inferenciales más complejos (como el análisis de varianza o el análisis de componentes principales).

R realiza tres funciones esenciales: (1) leer datos, (2) especificar el tipo de análisis que se quiere realizar con esos datos y (3) mostrar los resultados obtenidos tras los análisis. La interpretación de los resultados es tarea del investigador.

1Sitio de referencia: http://www.r-project.org.

2En el sentido GNU: http://gnu.org/philosophy/free-sw.es.html.

Instalación de R

Debian GNU/Linux

Mediante algún gestor de paquetes, solicite la instalación de los paquetes r-cran-rcmdr y r-cran-fbasics. Por ejemplo, en la línea de órdenes:

# aptitude install r-cran-rcmdr r-cran-fbasics

Emacs dispone de una interfaz a R llamada ESS (Emacs speaks statistics). Puede instalarla mediante

# aptitude install ess

y ejecutarla desde Emacs mediante M-x R.

OpenBSD

Instale el paquete R:

$ sudo pkg_add R

y luego los paquetes de R llamados Rcmdr y fBasics:

$ R
> install.packages(c("Rcmdr","fBasics"))

FreeBSD

Instale el porte R:

# cd /usr/ports/math/R
# make install clean

y luego los paquetes de R llamados Rcmdr y fBasics:

$ R
> install.packages(c("Rcmdr","fBasics"))

ReactOS y Microsoft Windows

Si dispone de acceso a Internet:

1. Descargue el fichero ejecutable

  http://cran.es.r-project.org/bin/windows/base/R-2.8.0-win32.exe

2. Ejecute el fichero descargado, teniendo en cuenta:

a) Cuando pregunta si deseamos establecer opciones de instalación, escoja Sí.

b) Para el modo de presentación (MDI o SDI), escoja SDI (es conveniente por la implementación Tcl/Tk de Rcommander).

c) Para la conexión a la red, escoja Internet2 (al menos, dentro de la Universidad Oviedo,

para obtener adecuadamente la información sobre el proxi).

3. Ejecute el programa R, ya instalado.

4. En el menú Paquetes, pinche en Seleccionar espejo CRAN.

5. En el cuadro de diálogo, escoja Spain (Madrid) o algún otro cercano, y pulse OK.

6. En el menú Paquetes, pinche en Instalar paquete(s)

7. Escoja fBasics y Rcmdr y acepte.

Lenguaje R: tipos de objetos

En esta sección se realiza una descripción somera de los tipos de objetos disponibles en el lenguaje de programación R, que puede ser útil para interpretar la información que presentan las salidas de Rcommander.^{3}

Tipos básicos

Los tipos de valores básicos en R son: lógicos (booleanos), numéricos y cadenas de caracteres.^{4} Las constantes lógicas son TRUE (verdadero) y FALSE (falso)

> 1 == 1
[1] TRUE
> 1 == 2
[1] FALSE
> T
[1] TRUE
> F
[1] FALSE

Téngase en cuenta que T y F son objetos (variables del lenguaje) que valen inicialmente TRUE y FALSE respectivamente, aunque pueden ser redefinidos.

Las constantes numéricas adoptan la notación habitual en informática; por ejemplo, la notación exponencial o científica:

> 1e4
[1] 10000

El resultado de una operación matemática puede ser Inf (infinito) o NaN (not a number: no un número):

> 3/0
[1] Inf
> log(0)

3Para profundizar más, consúltese por ejemplo http://cran.r-project.org/doc/contrib/rdebuts_es.pdf o http://cran.r-project.org/doc/contrib/R-intro-1.1.0-espanol.1.pdf.

4Detallando más, hay tres tipos numéricos (enteros, reales [llamados también dobles o de coma deslizante] y complejos) y un tipo adicional crudo para almacenar octetos.

[1] -Inf
> log(-1)
[1] NaN
Warning message:
In log(-1) : NaNs produced
> sqrt(-1)
[1] NaN
Warning message:
In sqrt(-1) : NaNs produced
> sqrt(-1+0i)
[1] 0+1i
> log(-1+0i)
[1] 0+3.141593i

Nótese cómo en el ejemplo algunos NaNes pueden evitarse usando números complejos.

Las cadenas pueden delimitarse por comillas o por apóstrofos, lo cual puede aprovecharse para incluir cómodamente comillas en la cadena^{5}:

> "nombre"
[1] "nombre"
> 'Lo llamaban "Trinidad"'
[1] "Lo llamaban \"Trinidad\""

Queda mencionar la constante NA (not available: no disponible) que indica un valor ausente. Aparece, por ejemplo, al leer campos numéricos vacíos durante la importación de un fichero. Al igual que NaN, tiene comportamiento viral (contagia):

> 3 + NA
[1] NA

La asignación de valores a objetos se realiza mediante el operador <-^{6}:

> a <- 8.5

Pero ¡ojo!

> a < -3
[1] FALSE
> a<-3
> a
[1] 3

Ten cuidado dónde pones los espacios.

Hasta ahora los valores considerados son simples; podrían llamarse átomos o escalares. En R hay también estructuras compuestas, entre las que veremos los vectores, las matrices, las listas y los dataframes.

5Sin necesidad de escaparlas mediante una retrobarra.

6Fuera de los argumentos de funciones puede sustituirse por =, así: a = 8.5.

Vectores

Podemos crear un vector mediante la función c, que concatena:

> b <- c(1,2,3,10)

Los escalares en R son siempre vectores de longitud 1, así que la asignación de a en la sección anterior es equivalente a:

> a <- c(8.5)

Toda la aritmética en R (así como muchas de sus funciones) es vectorial. Por ejemplo, se pueden sumar vectores:

> a+b
[1]  9.5 10.5 11.5 18.5

El [1] que aparece al comienzo del renglón es una ayuda para localizar posiciones en vectores largos:

> 10:50
 [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
[26] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Así, el 35 ocupa la posición vigésimo-sexta.

En el ejemplo anterior se ha utilizado el operador : para crear una secuencia. La función seq generaliza la creación de secuencias:

> seq(0,3,0.5)
[1] 0.0 0.5 1.0 1.5 2.0 2.5 3.0

Es útil también la función rep para crear vectores con un elemento repetido:

> rep("A",5)
[1] "A" "A" "A" "A" "A"

Los vectores se pueden concatenar:

> bab <- c(b,a,b)
> bab
[1]  1.0  2.0  3.0 10.0  8.5  1.0  2.0  3.0 10.0

pero tenga en cuenta que en un vector todos los elementos han de ser del mismo tipo:

> c(bab,"cadena")
 [1] "1"      "2"      "3"      "10"     "8.5"    "1"      "2"      "3"
 [9] "10"     "cadena"

Se puede acceder a los elementos de un vector indicando a su vez un vector de subíndices (enteros positivos):

> bab[4]
[1] 10
> bab[4:6]
[1] 10.0  8.5  1.0
> bab[c(4,6)]
[1] 10 1

Si los subíndices son negativos, indican exclusión:

> bab[-4]
[1]  1.0  2.0  3.0  8.5  1.0  2.0  3.0 10.0
> bab[-(4:6)]
[1]  1  2  3  2  3 10
> bab[-c(4,6)]
[1]  1.0  2.0  3.0  8.5  2.0  3.0 10.0

Los elementos de un vector pueden tener asignados nombres. Por ejemplo, si creamos el vector v mediante la función quantile,

v <- quantile (1:100, c(.25,.50,.75))
names (v)

Se puede extraer el primer elemento de v mediante alguna de las dos formas siguientes:

v[1]
v["25%"]

Para quitar las etiquetas de un vector, se puede hacer de alguna de las dos maneras siguientes:

v <- as.numeric(v)
names(v) <- NULL

Matrices

Una matriz es la versión bidimensional de un vector:

> m <- matrix(1:6,nrow=2)
> m
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

Para obtener una submatriz, hay que indicar subíndices para filas y columnas; en blanco, para seleccionar toda la dimensión:

> m[1,2]
[1] 3
> m[1,]
[1] 1 3 5
> m[,2]
[1] 3 4
>  m[,2:3]
     [,1] [,2]
[1,]    3    5
[2,]    4    6
> m[,-1]
     [,1] [,2]
[1,]    3    5
[2,]    4    6

Obsérvese que al extraer una fila o columna el resultado es un vector. Si se quiere conservar el carácter de matriz, puede hacerse así:

> m[,2,drop=FALSE]

Se pueden pegar vectores o matrices por columnas mediante la función cbind para formar una nueva matriz:

> cbind(1:3,c(8,9,10))
     [,1] [,2]
[1,]    1    8
[2,]    2    9
[3,]    3   10
> cbind(m,c(100,200))
     [,1] [,2] [,3] [,4]
[1,]    1    3    5  100
[2,]    2    4    6  200

o por filas mediante la función rbind:

> rbind(1:3,c(8,9,10))
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    8    9   10

Se puede trasponer una matriz con la función t, hallar su determinante mediante det, su inversa mediante solve, multiplicarla con %*%, etcétera.

Al igual que los vectores, todos los elementos de una matriz han de ser del mismo tipo (homogéneos):

> m[1,1] <- "nombre"
> m
     [,1]     [,2] [,3]
[1,] "nombre" "3"  "5"
[2,] "2"      "4"  "6"

Se puede asignar un nombre a la dimensión de filas y otro a la dimensión de columnas, y a cada fila y columna, así:

dimnames (m) <- list (sujetos   = c ("Juana", "Pepe"),
                      variables = c ("altura", "peso", "sexo"))

Se pueden extraer mediante rownames(m) y colnames.

A veces, tales nombres aparecen automáticamente:

pesos   <- c (80, 75, 68, 97)
alturas <- c (120, 150, 185, 172)
datos   <- cbind (pesos, alturas)
datos [, "alturas"]

Como en el caso de los vectores, se pueden usar las etiquetas en vez de los índices para seleccionar parte de la matriz.

Listas

Para almacenar elementos heterogéneos hay que recurrir a una lista:

> l <- list(bab,"cadena")
> l
[[1]]
[1]  1.0  2.0  3.0 10.0  8.5  1.0  2.0  3.0 10.0
[[2]]
[1] "cadena"

Al subindicar con corchetes simples se obtiene una sublista:

> l[1]
[[1]]
[1]  1.0  2.0  3.0 10.0  8.5  1.0  2.0  3.0 10.0

Como en el caso de los vectores, los corchetes simples permiten extraer más de un elemento: por ejemplo, l[1:2]

Al subindicar con corchetes dobles se puede extraer UN elemento de la lista^{7}:

> l[[1]]
[1]  1.0  2.0  3.0 10.0  8.5  1.0  2.0  3.0 10.0
> l[[1]][4:6]
[1] 10.0  8.5  1.0

7Los vectores también pueden subindicarse con corchetes dobles. Por comodidad, con vectores suelen usarse siempre corchetes simples porque todo escalar es un vector de tamaño uno (por lo que es exactamente lo mismo un elemento de un vector que un subvector de longitud uno).

Los corchetes dobles no permiten extraer más de un elemento

Los elementos de una lista pueden tener etiquetas, como en los vectores. En el caso de las listas, las etiquetas se pueden usar como lista[["etiqueta"]] o como lista$etiqueta:

> n <- list(bab=bab,cadena="Cadena")
> n[[1]]
[1]  1.0  2.0  3.0 10.0  8.5  1.0  2.0  3.0 10.0
> n$bab
[1]  1.0  2.0  3.0 10.0  8.5  1.0  2.0  3.0 10.0
> n$cadena
[1] "Cadena"

Dataframes

Un dataframe es una lista cuyos elementos son vectores, todos de igual longitud. Por tanto, se le pueden aplicar los operadores de listas y los de matrices. Es la estructura esencial para guardar valores de variables estadísticas:

> d <- data.frame(v1=c(2,4,8,9),v2=c("v","v","m","m"))
> d
  v1 v2
1  2  v
2  4  v
3  8  m
4  9  m
> d[1,2]
[1] v
Levels: m v
> d[1,]
  v1 v2
1  1  v
> d[,2]
[1] v v m m
Levels: m v
> d$v1
[1] 2 4 8 9
> d$v2
[1] v v m m
Levels: m v

Nótese que, al construir el dataframe, el vector de cadenas se ha convertido en “factor”, es decir, en un vector acompañado de una lista de “niveles” (modalidades de la variable estadística).

Funciones

Un objeto de R también puede almacenar una función:

> f <- function (x) x^2

que puede usarse como argumento de otras funciones

> sapply (5:10, sqrt)
[1] 2.236068 2.449490 2.645751 2.828427 3.000000 3.162278
> sapply (5:10, f)
[1]  25  36  49  64  81 100

Como se ve, la función sapply aplica una función a cada elemento de un vector, y devuelve un vector de resultados. La función apply hace lo mismo con matrices, bien por filas:

> m <- matrix(1:6,nrow=2)
> m
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> apply(m,1,sum)
[1]  9 12

bien por columnas:

> apply(m,2,sum)
[1]  3  7 11

Téngase en cuenta que sum es una función que calcula la suma de un vector.