Hace poco hice algo parecido. Hay bastantes maneras de agregar datos como este en R, pero el ddply
del paquete plyr
es mi manta de seguridad, y recurro a ella para cosas como ésta.
Supongo que tiene registros individuales para cada persona en su conjunto de datos, con edad, sexo y estado civil. No es necesario dividir los datos en varias tablas para este enfoque: si tiene mujeres en la tabla original, déjelas y añada el sexo como variable de agrupación.
require(plyr)
results.by.age <- ddply(.data = yourdata, .var = c("sex", "age"), .fun = function(x) {
data.frame(n = nrow(x),
ever.married.n = nrow(subset(x, marital.status %in%
c("Married", "Divorced"))),
ever.married.prop = nrow(subset(x, marital.status %in%
c("Married", "Divorced"))) / nrow(x)
)
}
)
Esto divide el data.frame yourdata
por combinaciones únicas de las variables sex
y age
. A continuación, para cada uno de esos trozos (denominados x
), calcula el número de personas que pertenecen a ese grupo ( n
), cuántos de ellos están casados ( ever.married.n
), y qué proporción de ellos están casados ( ever.married.prop
). Entonces devolverá un data.frame llamado results.by.age
con filas como
sex age n ever.married.n ever.married.prop
"Male" 25 264 167 0.633
Quizá no sea la forma más elegante o eficiente de hacerlo, pero este patrón general me ha resultado muy útil. Una de las ventajas de esto es que puedes recoger fácilmente y de forma transparente cualquier estadística que quieras del subconjunto, lo que puede ser útil si quieres, por ejemplo, añadir una línea de regresión al gráfico (peso por n
) o tener las proporciones masculinas y femeninas en el mismo gráfico y colorear los puntos por sexo.
Aquí hay una versión revisada utilizando el summarise()
de plyr - el efecto es el mismo, pero summarise()
tiene un par de ventajas clave: - Funciona dentro del entorno del subconjunto actual, por lo que en lugar de escribir x$marital.status
Puedo escribir simplemente marital.status
. - Me permite referirme a otras variables que ya he creado, lo que facilita mucho los porcentajes, las transformaciones y demás, si ya he hecho num
y denom
la proporción de num
es sólo num / denom
.
results.by.age <- ddply(.data = yourdata, .var = c("sex", "age"), .fun = summarise,
n = length(marital.status),
ever.married = sum(marital.status %in% c("Married", "Divorced")),
ever.married.prop = ever.married / n # Referring to vars I just created
)
3 votos
¿Podría publicar un fragmento de sus datos, para que tengamos una mejor idea de lo que quiere manipular?