11.3 Transformaciones de datos por bloques

La función summarize devuelve un único registro por bloque. Sin embargo, en ocasiones interesa devolver la tabla entera transfromada de alguna manera: por ejemplo, con alguna columna adicional calculada con el resto. Reemplazando summarize por transform se puede hacer, por ejemplo

tasa.paro <- dcast(paro, Gender + Provinces + Periodo ~ Situation)
tasa.paro <- transform(tasa.paro, tasa.paro = unemployed / active)
tasa.paro <- tasa.paro[, c("Gender", "Provinces", "Periodo", "tasa.paro")]

tmp <- ddply(tasa.paro, .(Gender, Provinces), 
             transform, rank = rank(-tasa.paro, ties = "random"))
res <- tmp[tmp$rank == 1,]

que obtiene el periodo en el que la tasa de paro tocó techo por provincia y sexo. Para ello es fundamental que la función rank se aplique a cada uno de los bloques definidos por Gender y Provinces, es decir, que comience a contar desde 1 para cada uno de ellos.

Selecciona, para cada periodo, las tres provincias en las que fue menor la tasa de paro tanto para hombres como para mujeres (por separado). Repite el ejercicio teniendo en cuenta la tasa global (o conjunta para hombres y mujeres) de paro.

Dispón airquality en formato largo y para cada variable y cada mes, extrae el día en que cada variable tuvo el máximo valor.

En el siguiente ejemplo vamos a crear un modelo a trozos. Usando estos datos, vamos a

  • crear un modelo lineal para cada colegio (con el que predecir la variable extro en función de otras)
  • asignar a cada sujeto dicha predicción
dat <- read.table("data/lmm_data.txt", header = T, sep = ",")
dat.preds <- ddply(dat, .(school), transform, 
                   pred = predict(lm(extro ~ open + agree + social + class)))

El código anterior funciona porque la función transform captura cada bloque (definido por la variable school) y pasa las variables extro, etc. a la expresión predict(lm(extro ~ open + agree + social + class)). Es posible realizar la misma operación sin transform, i.e., explícitamente, así:

foo <- function(x){
  modelo <- lm(extro ~ open + agree + social + class, data = x)
  res <- x
  res$preds <- predict(modelo)
  res
}
dat.preds <- ddply(dat, .(school), foo)

Es evidente que transform, aunque por sí sola no sea una función muy útil, usada en conjunción con ddply simplifica muchas operaciones.

Usando los datos del paro (en formato largo), calcula para cada provincia, periodo y situación laboral el porcentaje de los sujetos que son hombres y mujeres.

Pista: Puedes hacerlo en una única línea con ddply en combinación con transform. La clave consiste en que puedes calcular el total (sumando hombres y mujeres) por bloques y dividir por esa cantidad.

Usando de nuevo los datos del paro, crea una tabla en la que, para cada periodo, figure el porcentaje de los parados de España que viven en cada provincia.