En términos genéricos, todos los elementos que maneja R son objetos: un valor numérico es un objeto, un vector es un objeto, una función es un objeto, una base de datos es un objeto, un gráfico es un objeto, …
Para realizar un uso eficiente de R es preciso entender y aprender a manipular bien las distintas clases de objetos que maneja el programa. En esta sección nos vamos a ocupar particulamente de aquellos objetos que R utiliza para representar datos: valores, vectores, matrices, dataframes, series temporales y listas.
R utiliza, de hecho, programación orientada a objetos. Ello significa que una misma función hace cosas distintas según la clase del objeto que recibe como argumento, pudiendo incluso no hacer nada (o producir un error) si se le pasan argumentos de una clase inadecuada.
A modo de ejemplo, veamos como la función plot()
puede mostrar distintos gráficos según la clase del objeto a representar. Para ello supongamos que el siguiente vector representa el número de personas atendidas mensualmente en el servicio de urgencias de un centro de salud durante el pasado año (datos de enero a diciembre):
atendidos <- c(728,632,596,689,745,865,694,583,657,643,794,887)
atendidos
## [1] 728 632 596 689 745 865 694 583 657 643 794 887
class(atendidos)
## [1] "numeric"
La función class()
nos devuelve la clase del objeto atendidos
, que como vemos es numeric
. Podemos obtener una representación gráfica de este vector simplemente mediante:
plot(atendidos)
Ahora convertimos estos datos en serie temporal mediante la función ts()
, indicando que esta serie comienza en enero del año 2009 y que tiene una frecuencia de 12 observaciones por año (esto es, una por mes):
atendidos2 <- ts(atendidos,frequency=12,start=c(2009,1))
atendidos2
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2009 728 632 596 689 745 865 694 583 657 643 794 887
class(atendidos2)
## [1] "ts"
Como podemos ver, la clase del objeto atendidos2
es ts
(time series). Podemos comprobar que si aplicamos la misma función plot()
a atendidos2
, el gráfico obtenido es distinto que cuando se aplica a atendidos
, aún cuando los datos sean exactamente los mismos:
plot(atendidos2)
(En esta página se explica como mejorar este gráfico de forma que se muestren los meses en el eje horizontal)
La función plot
como muchas otras funciones en R, primero comprueba cuál es la clase del objeto sobre el que debe actuar, y en función de ello se comporta de una manera u otra.
En R (como en otros lenguajes de programación) hay dos clases fundamentales de datos: numéricos y alfanuméricos (o cadenas, strings en inglés; todo aquello que no sea un número es una cadena):
x=1
class(x)
## [1] "numeric"
y="a"
class(y)
## [1] "character"
Además de estas dos clases fundamentales R dispone de otras clases más específicas; por ejemplo integer
para números enteros, complex
para números complejos, logical
para variables lógicas o matrix
para matrices.
En R es posible “forzar” (“coerce”) la conversión de una clase de datos en otra, mediante comandos de la forma as.class. Por ejemplo:
x="1"
x
## [1] "1"
class(x)
## [1] "character"
y=as.integer(x)
y
## [1] 1
class(y)
## [1] "integer"
z=as.character(y)
z
## [1] "1"
class(z)
## [1] "character"
Se pueden agrupar varios elementos de la misma clase para formar un vector mediante el comando de concatenación c()
. La asignación de un nombre de variable a dicho vector se realiza mediante el símbolo =
. Así, podemos guardar las edades de 10 personas de una muestra en la variable edad
mediante:
edad = c(22, 34, 29, 25, 30, 33, 31, 27, 25, 25)
edad
## [1] 22 34 29 25 30 33 31 27 25 25
class(edad)
## [1] "numeric"
Como comando de asignación de nombres a vectores puede utilizarse además el símbolo <-
:
edad <- c(22, 34, 29, 25, 30, 33, 31, 27, 25, 25)
o también el símbolo ->
si bien en este caso debemos invertir la posición del nombre del vector y sus valores:
c(22, 34, 29, 25, 30, 33, 31, 27, 25, 25) -> edad
Podemos crear vectores alfanuméricos del mismo modo:
letras=c("a","b","c","d","e")
letras
## [1] "a" "b" "c" "d" "e"
class(letras)
## [1] "character"
Si en un vector se combinan elementos de clase numeric
y character
el vector resultante es de clase character
:
mezcla=c(1,2,3,"a","b","c")
mezcla
## [1] "1" "2" "3" "a" "b" "c"
class(mezcla)
## [1] "character"
La función length()
devuelve la longitud (número de elementos) del vector:
x=c(1,4,5,2,4,5,4,3,2,2,3,2,2,4,4,5,5,6,6,7)
length(x)
## [1] 20
Los valores perdidos constituyen una clase particular de dato, que se codifica siempre como NA
independientemente de que la variable sea numérica o alfanumérica. Con carácter general cualquier operación que involucre a un valor perdido dará como resultado también NA
. A modo de ejemplo, si el vector peso
recoge los pesos de 5 personas, habiéndose perdido el cuarto valor, se codificaría como:
peso=c(77,68,85,NA,73)
Si pretendemos calcular el peso medio, obtenemos como resultado un valor perdido:
mean(peso)
## [1] NA
Si, en cualquier caso, deseamos calcular la media de los pesos efectivamente disponibles, utilizaríamos la opción eliminar valores perdidos o NA remove que se declara como na.rm=TRUE
:
mean(peso, na.rm=TRUE)
## [1] 75.75
Una segunda clase de valores “perdidos”" en R corresponden a cálculos numéricos cuyos resultados son indefinidos, como por ejemplo \(\frac{0}{0}\) o \(log(-1)\). En este caso, el resultado que devuelve R es NaN
(Not a Number), que a todos los efectos es considerado como un valor perdido:
0/0
## [1] NaN
log(-1)
## [1] NaN
x=c(1,2,0)
y=c(2,4,0)
x/y
## [1] 0.5 0.5 NaN
Comprueba qué ocurre si tratas de convertir la cadena “ab” en un valor numérico mediante la función as.character()
Es posible acceder al valor que ocupa la posición k dentro de un vector x refiriéndonos a él como x[k]
. Así, podemos ver el contenido del tercer y quinto valores del vector edad
:
edad = c(22, 34, 29, 25, 30, 33, 31, 27, 25, 25)
edad[3]
## [1] 29
edad[5]
## [1] 30
o cuál es la cuarta letra de las definidas anteriormente:
letras[4]
## [1] "d"
Podemos acceder también simultáneamente a varios valores dentro de un vector. Por ejemplo, si deseamos ver del segundo al quinto de los valores observados en la variable edad
:
edad[2:5]
## [1] 34 29 25 30
Y si quisiéramos ver sólo los valores primero, tercero y séptimo:
edad[c(1,3,7)]
## [1] 22 29 31
La función which()
nos da las posiciones, dentro de un vector, de los valores que cumplen cierta condición. Por ejemplo, si definimos:
edad = c(22, 34, 29, 25, 30, 33, 31, 27, 25, 25)
la siguiente función nos devuelve las posiciones de los valores de este vector que son mayores que 25:
which(edad>25)
## [1] 2 3 5 6 7 8
esto es, los valores del vector edad
mayores que 25 son los que ocupan las posiciones 2, 3, 5, 6, 7 y 8.
Podemos asignar estas posiciones a una nueva variable:
mayores25=which(edad>25)
y utilizarla para mostrar cuáles son concretamente esos valores mediante:
edad[mayores25]
## [1] 34 29 30 33 31 27
Esta expresión puede simplificarse; si no utilizamos which()
obtenemos exactamente el mismo resultado:
edad[edad>25]
## [1] 34 29 30 33 31 27
Se puede realizar también la selección de valores de un vector condicionando por los valores de otro vector. Por ejemplo, si las diez edades del ejemplo anterior corresponden a personas cuyo sexo viene dado por:
sexo <- c("M","H","H","M","M","H","M","M","H","H")
podríamos seleccionar la edad de las mujeres simplemente mediante:
edad[sexo=="M"]
## [1] 22 25 30 31 27
Si además el tiempo (en minutos) que cada una de estas personas se ha pasado al teléfono durante el último día es:
tiempo=c(14.21, 10.36, 11.89, 13.81, 12.03, 10.99, 12.48, 13.37, 12.29, 11.92)
podemos seleccionar el sexo de aquellos que han hablado más de 13 minutos diarios mediante:
sexo[tiempo>13]
## [1] "M" "M" "M"
© 2016 Angelo Santana, Carmen N. Hernández, Departamento de Matemáticas ULPGC