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
,tapply
y 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 ladt
función delstats
paquete. Intenté editarlo, pero no puedo hacer ediciones con menos de seis caracteres.data.table
es 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
dplyr
paquete es probablemente la forma más rápida de hacerlo.o equivalente, usando el operador
dplyr
/magrittr
pipe: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.plyr
lugar de ladplyr
que 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.by
función en elpsych
paquete.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
summaryBy
en el paquete doBy es la más conveniente para esto:fuente
Usa el
sqldf
paquete. 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
for
bucle aquí, puede construir su marco de datos en línea, IMO. Para latapply
llamada, usefunction(x) c(mean(x),sd(x)))
ycbind
el resultado ya que el OP solicitó ambas estadísticas. Además,ddply
desde el paquete plyr podría hacerlo sin problemas.cbind("mean"=mperage,"stdev"=stperage) gives no 'group' column. Will be joining by
cbind (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
aggregates
funció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 delgplots
paquete.Vea aquí las soluciones de otros.
fuente