Tengo un marco de datos R como este:
age group
1 23.0883 1
2 25.8344 1
3 29.4648 1
4 32.7858 2
5 33.6372 1
6 34.9350 1
7 35.2115 2
8 35.2115 2
9 35.2115 2
10 36.7803 1
...
Necesito obtener el marco de datos en la siguiente forma:
group mean sd
1 34.5 5.6
2 32.3 4.2
...
El número de grupo puede variar, pero sus nombres y cantidad se pueden obtener llamando levels(factor(data$group))
¿Qué manipulaciones se deben hacer con los datos para obtener el resultado?
r
data-transformation
Yuriy Petrovskiy
fuente
fuente

aggregate,tapplyy luego stackoverflow.com para cualquier pregunta de codificación posterior de este tipo.Respuestas:
Aquí está la variante de una línea de plyr usando ddply :
Aquí hay otra variante de una línea que usa el nuevo paquete data.table .
Este es más rápido, aunque esto se nota solo en la tabla con 100k filas. Tiempos en mi Macbook Pro con procesador 2.53 Ghz Core 2 Duo y R 2.11.1:
Es posible ahorrar más si utilizamos
setkey:fuente
dt <- data.table(dtf)lugar dedt <- data.table(dt)en el segundo bloque de código. De esa manera, está creando la tabla de datos desde un marco de datos en lugar de desde ladtfunción delstatspaquete. Intenté editarlo, pero no puedo hacer ediciones con menos de seis caracteres.data.tablees la mejor manera de agregar datos y esta respuesta es excelente, pero solo rasca la superficie. Además de ser sintácticamente superior, también es extremadamente flexible y tiene muchas características avanzadas que incluyen uniones y mecanismos internos. Consulte las preguntas frecuentes, la página de github o el curso para obtener más información.Una posibilidad es usar la función de agregado . Por ejemplo,
le da la segunda columna del resultado deseado.
fuente
data.frame(group=levels(factor(data$group)),mean=(aggregate(data$age, by=list(data$group), FUN=mean)$x),sd=(aggregate(data$age, by=list(data$group), FUN=sd)$x))Hice la cosa llamando pero no estoy seguro de que sea la forma correcta. No estoy seguro de lo que sucederá, entonces los resultados de las columnas unidas estarán en un orden diferente (creo que es posible). ¿Cuál es tu opinión?aggregate():aggregate(age ~ group, data=dat, FUN = function(x) c(M=mean(x), SD=sd(x)))Como está manipulando un marco de datos, el
dplyrpaquete es probablemente la forma más rápida de hacerlo.o equivalente, usando el operador
dplyr/magrittrpipe:EDITAR el uso completo del operador de tubería:
fuente
dplyr. Ha hecho que muchas tareas de R sean simples y muchos de estos métodos sean obsoletos.plyrlugar de ladplyrque estaba causando el problema.¡Genial, gracias por agregar la solución dplyr!
Resulta que entonces, dplyr y data.table están muy cerca:
data.table sigue siendo el más rápido, seguido de cerca por dplyr (), que curiosamente parece más rápido en data.frame que en data.table:
fuente
Además de las sugerencias existentes, es posible que desee consultar la
describe.byfunción en elpsychpaquete.Proporciona una serie de estadísticas descriptivas que incluyen la media y la desviación estándar basadas en una variable de agrupación.
fuente
He encontrado que la función
summaryByen el paquete doBy es la más conveniente para esto:fuente
Usa el
sqldfpaquete. Esto le permite ahora usar SQL para resumir los datos. Una vez que lo cargues, puedes escribir algo como:fuente
Editado: según las sugerencias de chl
La función que está buscando se llama "tapply", que aplica una función por grupo especificado por un factor.
Realmente sugiero trabajar a través de un tutorial básico de R que explique todas las estructuras de datos y métodos comúnmente utilizados. De lo contrario, se quedará atascado cada pulgada durante la programación. Consulte esta pregunta para obtener una colección de recursos gratuitos disponibles.
fuente
forbucle aquí, puede construir su marco de datos en línea, IMO. Para latapplyllamada, usefunction(x) c(mean(x),sd(x)))ycbindel resultado ya que el OP solicitó ambas estadísticas. Además,ddplydesde el paquete plyr podría hacerlo sin problemas.cbind("mean"=mperage,"stdev"=stperage) gives no 'group' column. Will be joining bycbind (grupo = niveles (factor (datos $ grupo)), "mean" = mperage, "stdev" = stperage) `¿correcto?Aquí hay un ejemplo con la función
aggregates()que hice yo mismo hace algún tiempo:Da el siguiente resultado:
Tal vez pueda obtener el mismo resultado a partir de la función R split ():
Permítanme volver a la salida de la
aggregatesfunción. Puedes transformarlo en una hermosa mesa usandoreshape(),xtabs()yftable():Esto da:
Hermosa, ¿no es así? Puede exportar esta tabla a un pdf con la
textplot()función delgplotspaquete.Vea aquí las soluciones de otros.
fuente