Eu tenho um quadro de dados com duas colunas. A primeira coluna contém categorias como "Primeiro", "Segundo", "Terceiro" e a segunda coluna possui números que representam o número de vezes que vi os grupos específicos de "Categoria".
Por exemplo:
Category Frequency
First 10
First 15
First 5
Second 2
Third 14
Third 20
Second 3
Quero classificar os dados por categoria e somar todas as frequências:
Category Frequency
First 30
Second 5
Third 34
Como eu faria isso em R?
rowsum
.Respostas:
Usando
aggregate
:No exemplo acima, várias dimensões podem ser especificadas no
list
. Várias métricas agregadas do mesmo tipo de dados podem ser incorporadas viacbind
:(incorporando @thelatemail comment), também
aggregate
possui uma interface de fórmulaOu, se você quiser agregar várias colunas, poderá usar a
.
notação (funciona também para uma coluna)ou
tapply
:Usando estes dados:
fonte
Você também pode usar o pacote dplyr para esse fim:
Ou, para várias colunas de resumo (também funciona com uma coluna):
Aqui estão mais alguns exemplos de como resumir dados por grupo usando funções dplyr usando o conjunto de dados interno
mtcars
:Para mais informações, incluindo o
%>%
operador, consulte a introdução ao dplyr .fonte
funs()
argumentosummarise_all
e suas funções relacionadas (summarise_at
,summarise_if
)A resposta fornecida pelo rcs funciona e é simples. No entanto, se você estiver lidando com conjuntos de dados maiores e precisar de um aumento de desempenho, há uma alternativa mais rápida:
Vamos comparar isso com a mesma coisa usando data.frame e acima:
E se você deseja manter a coluna, esta é a sintaxe:
A diferença se tornará mais visível com conjuntos de dados maiores, como o código abaixo demonstra:
Para várias agregações, você pode combinar
lapply
e da.SD
seguinte maneirafonte
data[, sum(Frequency), by = Category]
. Você pode usar o.N
que substitui asum()
função.data[, .N, by = Category]
. Aqui está uma folha deVocê também pode usar a função by () :
Esses outros pacotes (plyr, remodelar) têm o benefício de retornar um data.frame, mas vale a pena se familiarizar com by (), pois é uma função base.
fonte
Vários anos depois, apenas para adicionar outra solução R básica simples que não está presente aqui por algum motivo -
xtabs
Ou se você quer uma
data.frame
voltafonte
fonte
Se
x
for um quadro de dados com seus dados, o seguinte fará o que você deseja:fonte
Embora eu tenha me convertido recentemente
dplyr
para a maioria desses tipos de operações, osqldf
pacote ainda é muito bom (e IMHO mais legível) para algumas coisas.Aqui está um exemplo de como essa pergunta pode ser respondida com
sqldf
fonte
Apenas para adicionar uma terceira opção:
EDIT: esta é uma resposta muito antiga. Agora eu recomendaria o uso de
group_by
esummarise
dedplyr
, como na resposta do @docendo.fonte
Acho
ave
muito útil (e eficiente) quando você precisa aplicar diferentes funções de agregação em diferentes colunas (e você deve / deseja manter a base R):por exemplo
Dada esta entrada:
queremos agrupar por
Categ1
eCateg2
computar a somaSamples
e a média deFreq
.Aqui está uma solução possível usando
ave
:Resultado:
fonte
O recentemente adicionado
dplyr::tally()
agora torna isso mais fácil do que nunca:fonte
Você pode usar a função
group.sum
do pacote Rfast .O Rfast possui muitas funções de grupo e
group.sum
é uma delas.fonte
usando em
cast
vez derecast
(note'Frequency'
agora'value'
)para obter:
fonte
Outra solução que retorna somas por grupos em uma matriz ou quadro de dados e é curta e rápida:
fonte
Desde então
dplyr 1.0.0
, aacross()
função poderia ser usada:Se estiver interessado em várias variáveis:
E a seleção de variáveis usando ajudantes selecionados:
Dados de amostra:
fonte