Crearemos una animación que desplace un punto por la curva de la función seno entre -pi
y pi
for(i in seq(-pi,pi,0.1)){plot(sin,-pi,pi);points(i,sin(i))}
Con un poco de control sobre el tiempo se puede apreciar mejor:
for(i in seq(-pi,pi,0.1)){plot(sin,-pi,pi);abline(h=0,col="grey");points(i,sin(i));Sys.sleep(0.1)}
Vaya lio … es necesario un poco de organización: R + editor = solución: vim
, emacs
, gvim
xemacs
, gedit
, kedit
, tinn-R
, nano
, … block de notas. La ayuda se mejora cuando el
editor nos muestra las pareja de los paréntesis, corchetes o llaves.
for (i in seq(-pi, pi, 0.1)){ plot(sin, -pi, pi) abline(h = 0, col = "grey") points(i, sin(i)) Sys.sleep(0.1) }
Otro ejemplo:
for (i in 1:360) { plot(1, ann = F, type = "n", axes = F) text(1, 1, "Animation", srt = i, col = rainbow(360)[i], cex = 7 * i/360) Sys.sleep(0.01)}
Extraido de esta página.
Para obtener la lista de formatos de salida puede utilizarse ?Devices
: pdf(), postscript(), png(), …
En ellos puede definirse más de un gráfico por página mediante la función par()
, por ejemplo: par(mfrow=c(2,3))
,
para una división regular del área gráfica; o mediante layout()
, que permite un reparto del área más completo.
Para leer datos de un fichero, local en red, utilizaremos la función read.table()
.
read.table("http://www.um.es/docencia/emc/datos/evolpobmun.dat") -> x
Cuando se utiliza fichero de datos datos de otros directorios siempre (winxx, linux, …) se utiliza el caraćter \
para
describir el nombre:
read.table("c:/tesis/experimento/lote1/datos.dat") -> x
Debe cuidarse siempre de que el fichero se lee con las especificaciones adecuadas: separador de campos, caracter para separar los decimales, tipo de codificación de los caracteres, …
read.table("http://www.um.es/docencia/emc/datos/din.pob.dat",sep=",")
Una vez leido el fichero, y para el data.frame
obtenido: x
, puede comprobarse que se corresponde con lo esperado utilizando las
siguientes funciones:
ncol(x)
y nrow(x)
: proporciona el número de columnas y filas de x.dim(x)
: vector con el número de columnas y filas de xcolnames(x)
: nombre de las columnas de x.rownames(x)
: nombre de las filas de xt(x)
: traspone la tabla (cuidado con la homogendidad de las variables).Desribiremos el comportamiento de una variables mediante un histograma y analizaremos que es un objeto de la clase histograma
read.table("http://www.um.es/docencia/emc/datos/iris.dat") -> x attach(x) hist(lonsep, 5) hist(lonsep, 5, freq = F) hist(lonsep, 5, plot = F) hist(lonsep, 5, plot = F)->x.hist
Una vez construido el objeto histograma x.hist
conoceremos su propiedades mediante:
names(x.hist) str(x.hist)
Podemos acceder a los elemento el objeto escrinbiendo x.hist$
y pulsando el tabulador
lines(x.hist$mids,x.hist$density,lwd=5) lines(x.hist$mids,x.hist$density,lwd=2,col=2)
La función attributes()
nos ayuda a identificar rápidamente el tipo de objeto:
attributes(x.hist) attributes(x) attributes(x)$class
Para cada una de las funciones de R que describen distribuciones de probabilidad hay las cuatro variantes que se identifican por la inicial:
dffff(x) | para el valor la funcion de distribución en x |
pffff(x) | para la probabilidad acumulada hasta el valor x |
qffff(p) | para el percentil que acumula la probabilidad p |
rffff(n) | que genera n valores aleatorios de la distribución |
Siendo ffff
:
unif | distribución uniforme |
norm | distribución normal |
pois | distribución de Poisson |
binom | distribución binomial |
gamma | distribución gamma |
… | apropos (“^r”) para echar un vistazo rápido |
Calculando y representando valores de la normal:
plot(dnorm,-3,3) dnorm(0) pnorm(2) qnorm(0.975) plot(pnorm,-3,3) plot(qnorm,0,1) plot(rnorm,-3,3) plot(rnorm,-3,3,ylim=c(-3,3))
Media de los individuos por grupos:
split(lonsep,especie,mean) lapply(split(lonsep,especie),mean)
as.matrix(lapply(split(lonsep,especie),mean))
Otra opción:
by(lonsep, especie, mean) as.matrix(by(lonsep, especie, mean))
Todas las variables a la vez:
aggregate(x, by=list(especie), FUN = "mean")
Utilizaremos el fichero de datos evolpobmun.dat
, que ya hemos comprobado antes:
read.table("http://www.um.es/docencia/emc/datos/evolpobmun.dat") -> x
Se puede hacer una selección de filas automáticamente:
apply(x,1,sum) #¿Hay problemas con NA? !is.na(apply(x,1,sum))->seleccion.casos
Una clasificación por k-means
kmeans(x[seleccion.casos, ], 8) kmeans(x[seleccion.casos, ], 8) -> x.km8
Una clasificación jerárquica:
plot(hclust(dist(x[seleccion.casos,]),method="mc"),hang=-1)
Transformado los datos para otro análisis:
tc <- (x[seleccion.casos,1:9] - x[seleccion.casos,2:10]) / x[seleccion.casos,1:9] plot(hclust(dist(tc),method="mc")->tc.hcl,hang=-1)
Comparando las dos clasificaciones:
cutree(tc.hcl,8) ->tc.h8 table(x.km8$cl,tc.h8)