Tengo un marco de datos con dos columnas. La primera columna contiene categorías como "Primero", "Segundo", "Tercero", y la segunda columna tiene números que representan la cantidad de veces que vi los grupos específicos de "Categoría".
Por ejemplo:
Category Frequency
First 10
First 15
First 5
Second 2
Third 14
Third 20
Second 3
Quiero ordenar los datos por categoría y sumar todas las frecuencias:
Category Frequency
First 30
Second 5
Third 34
¿Cómo haría esto en R?
rowsum
.Respuestas:
Utilizando
aggregate
:En el ejemplo anterior, se pueden especificar varias dimensiones en
list
. Se pueden incorporar múltiples métricas agregadas del mismo tipo de datos a través decbind
:(incrustando el comentario de @thelatemail), también
aggregate
tiene una interfaz de fórmulaO si desea agregar varias columnas, puede usar la
.
notación (también funciona para una columna)o
tapply
:Usando estos datos:
fuente
También puede usar el paquete dplyr para ese propósito:
O, para varias columnas de resumen (también funciona con una columna):
Aquí hay algunos ejemplos más de cómo resumir datos por grupo usando las funciones dplyr usando el conjunto de datos incorporado
mtcars
:Para obtener más información, incluido el
%>%
operador, consulte la introducción a dplyr .fuente
funs()
argumentosummarise_all
y sus funciones relacionadas (summarise_at
,summarise_if
)La respuesta proporcionada por rcs funciona y es simple. Sin embargo, si está manejando conjuntos de datos más grandes y necesita un aumento de rendimiento, existe una alternativa más rápida:
Comparemos eso con lo mismo usando data.frame y lo anterior arriba:
Y si desea mantener la columna, esta es la sintaxis:
La diferencia se hará más notable con conjuntos de datos más grandes, como lo demuestra el siguiente código:
Para múltiples agregaciones, puede combinar
lapply
y de la.SD
siguiente manerafuente
data[, sum(Frequency), by = Category]
. Podrías usar.N
que sustituye a lasum()
función.data[, .N, by = Category]
. Aquí hay una hoja de trucos útil: s3.amazonaws.com/assets.datacamp.com/img/blog/…También puede usar la función by () :
Esos otros paquetes (plyr, rehape) tienen la ventaja de devolver un data.frame, pero vale la pena estar familiarizado con by () ya que es una función base.
fuente
Varios años después, solo para agregar otra solución base R simple que no está presente aquí por alguna razón:
xtabs
O si quieres un
data.frame
respaldofuente
fuente
Si se
x
trata de un marco de datos con sus datos, lo siguiente hará lo que desee:fuente
Si bien recientemente me convertí
dplyr
para la mayoría de estos tipos de operaciones, elsqldf
paquete sigue siendo realmente agradable (y en mi humilde opinión, más legible) para algunas cosas.Aquí hay un ejemplo de cómo se puede responder esta pregunta con
sqldf
fuente
Solo para agregar una tercera opción:
EDITAR: esta es una respuesta muy antigua. Ahora recomendaría el uso de
group_by
ysummarise
desdedplyr
, como en @docendo respuesta.fuente
Me parece
ave
muy útil (y eficiente) cuando necesita aplicar diferentes funciones de agregación en diferentes columnas (y debe / desea pegarse en la base R):p.ej
Dada esta entrada:
queremos agrupar por
Categ1
yCateg2
y calcular la suma deSamples
y media deFreq
.Aquí hay una posible solución usando
ave
:Resultado:
fuente
El agregado recientemente
dplyr::tally()
ahora hace que esto sea más fácil que nunca:fuente
Puede usar la función
group.sum
del paquete Rfast .Rfast tiene muchas funciones de grupo y
group.sum
es una de ellas.fuente
usando en
cast
lugar derecast
(la nota'Frequency'
es ahora'value'
)Llegar:
fuente
Otra solución que devuelve sumas por grupos en una matriz o un marco de datos y es corta y rápida:
fuente
Desde entonces
dplyr 1.0.0
, laacross()
función podría usarse:Si está interesado en múltiples variables:
Y la selección de variables con ayudantes seleccionados:
Data de muestra:
fuente