Hola:
Para agrupar datos a partir de un conjunto de los mismos existentes en un data.frame, estoy utilizando tres bucles for anidados. Como todavía soy novato con R es lo mejor que he sido capaz de hacer, pero me gustaría saber si es posible simplificar esos tres bucles anidados.
La otra duda es que, a partir del nuevo objeto data.frame creado con los bucles for quiero crear un gráfico de cajas (boxplot) para cada una de las filas, pero que quede en una sola «pantalla», por ahora no lo he conseguido.
Entro a exponer ejemplo y código.
Tengo un objeto data.frame de este tipo:
Mes - Dirección - Clase 1 - Clase 2 - Clase 3
1 - Norte - 10 - 30 - 60
1 - Este - 15 - 35 - 50
1 - Sur - 25 - 25 -50
1 - Oeste - 35 - 35 - 30
y así para los doce meses del año. A partir de este objeto, quiero sacar un conjunto de datos de este tipo:
Norte, Clase 1: Mes 1, Mes 2, Mes 3...
Norte, Clase 2: Mes 1, Mes 2, Mes 3...
Lo he logrado con este código:
######## Código ##########
vuelta=1
for (i in 1:length(Aero.direcciones)) {
for (j in 1:length(Aero.clases)) {
var.interna=rep(0,12)
# print(Aero.clases[j])
for (z in 1:12) {
var.interna[z]=Aero.vientos[which(Aero.vientos[,2]==
Aero.direcciones[i])[z],Aero.clases[j]]
} #Fin del bucle de los meses. Cambia de clase.
var.interna[which(is.na(var.interna))]=0
if (sum(var.interna) != 0) {
vuelta=vuelta+1
Aero.conj.datos[vuelta,]=data.frame(
matrix(var.interna,nrow=1,byrow=T),row.names=paste(
Aero.direcciones[i],"-",Aero.clases[j]
)
)
} # Fin del if
# print(paste("Vuelta dentro clases",vuelta))
} # Fin del bucle de las clases. Cambia de dirección.
# print(paste("Dirección",Aero.direcciones[i],"Vuelta",vuelta))
}
rm(i,j,z,var.interna,vuelta)
######### Fin de código ######
Esta línea:
var.interna[which(is.na(var.interna))]=0
es porque en el objeto original los datos que aparecen como NA son, en realidad, 0. Como en algunas ocasiones la dirección-clase es 0 para todos los meses, directamente lo elimino con el if siguiente.
Aclaro que en el data.frame que se crea (Aero.conj.datos) empiezo en [2,] porque previamente ya tengo una línea creada con una situación especial.
¿Habría alguna forma de simplificarlo?
En cuanto a la gráfica, estoy utilizando esto:
sapply(1:73, function(x) boxplot(as.vector(as.matrix(Aero.conj.datos[x,]))))
Pero, aunque crea los gráficos de cajas que persigo, no me lo hace todo en la misma «pantalla» que es lo que quiero.
¿Alguna forma de poder obtener ese gráfico?
Gracias por adelantado.
Un saludo.
R. Gómez