2011-07-23 18 views
6

que conozco comandos como xtabs y mesa permiten a un usuario hacer tabulación cruzadaCálculo de la media de los valores en las tablas usando fórmulas [R]

Por ejemplo el comando siguiente genera una tabla dinámica que muestra el número de coches que tener la misma cantidad de engranajes y cilindros

> xtabs(~cyl+gear, data = mtcars) 
    gear 
cyl 3 4 5 
    4 1 8 2 
    6 2 4 1 
    8 12 0 2 
> 

podemos extender la fórmula para que pudiera mostrar la suma de la potencia del motor de los coches en cada bin

> xtabs(hp~cyl+gear, data = mtcars) 
    gear 
cyl 3 4 5 
    4 97 608 204 
    6 215 466 175 
    8 2330 0 599 
> 

ahora me pregunto, ¿es posible calcular la media de los caballos de fuerza para autos en cada contenedor? por ejemplo, algo como esto xtabs(mean(hp)~cyl+gear, data = mtcars)

+2

No estoy seguro de cómo hacerlo con 'xtabs' (que nunca he usado antes), pero hacerlo con el paquete' reshape', una forma es 'fundido (melt (mtcars, id = c ("cyl", "gear")), cyl ~ gear, subconjunto = variable == "hp", mean) '. – grautur

+1

xtabs (hp ~ cyl + gear, data = mtcars)/xtabs (~ cyl + gear, data = mtcars) – jverzani

Respuesta

10

Puede hacerlo en una línea usando cast de la biblioteca reshape

cast(mtcars, cyl ~ gear, value = 'hp', fun = mean) 
+0

+1 simple, claro, directo. Buena respuesta como siempre Ramnath! –

7

Una respuesta interesante que he recibido desde r-ayuda es la siguiente:

> attach(mtcars) 
> tapply(hp,list(cyl,gear),mean) 
     3  4  5 
4 97.0000 76.0 102.0 
6 107.5000 116.5 175.0 
8 194.1667 NA 299.5 
> 
+1

Sí, esto es lo correcto. No uso xtabs, solo uso la función de aplicar, aplicar y aplicar estándar, ya que lo logran todo. Desde la primera vez que nuevo, debe poder resolverse con la aplicación estándar, ¡y así es! Gracias. – TMS

+1

+1 para la base, pero no es necesario adjuntar, solo usa la lista de funciones (x) (x $ cyl, x $ gear), media) en la instrucción apply. Adjuntar es una mala práctica de programación y puede provocar grandes problemas más adelante. –

+3

O 'con (mtcars, tapply (hp, list (cyl, gear), mean)) ' –

3

(Moving mi comentario a una respuesta, por lo que puedo editar mejor.)

No estoy seguro de cómo hacerlo con xtabs (que nunca he usado antes), pero aquí hay un par de maneras de hacerlo usando los paquetes reshape y plyr.

> x = melt(mtcars, id = c("cyl", "gear"), measure = c("hp")) 
> cast(x, cyl ~ gear, mean) 

> x = ddply(mtcars, .(cyl, gear), summarise, hp = mean(hp)) 
> cast(x, cyl ~ gear) 
+0

+1 para lanzar, ¡sin necesidad de derretir! –

0

Otra manera de calcularlo es mediante el uso de la función de agregado(). Aunque el resultado no está en la forma de una tabla. (A través de twitter)

> aggregate(hp~cyl+gear,data=mtcars,mean) 
    cyl gear  hp 
1 4 3 97.0000 
2 6 3 107.5000 
3 8 3 194.1667 
4 4 4 76.0000 
5 6 4 116.5000 
6 4 5 102.0000 
7 6 5 175.0000 
8 8 5 299.5000 
> 
Cuestiones relacionadas