Suponha que eu queira calcular a proporção de valores diferentes dentro de cada grupo. Por exemplo, usando os mtcars
dados, como faço para calcular a frequência relativa do número de marchas por am (automático / manual) de uma só vez dplyr
?
library(dplyr)
data(mtcars)
mtcars <- tbl_df(mtcars)
# count frequency
mtcars %>%
group_by(am, gear) %>%
summarise(n = n())
# am gear n
# 0 3 15
# 0 4 4
# 1 4 8
# 1 5 5
O que eu gostaria de alcançar:
am gear n rel.freq
0 3 15 0.7894737
0 4 4 0.2105263
1 4 8 0.6153846
1 5 5 0.3846154
prop.table()
/sweep()
. Além disso, em outras questões algumas pessoas estão pedindo a opção de incluir zero-contagens para variáveis ou variáveis-interaçõesRespostas:
Tente o seguinte:
Na vinheta dplyr :
Assim, após o
summarise
, a última variável de agrupamento especificada emgroup_by
'gear' é removida. Namutate
etapa, os dados são agrupados pelas variáveis de agrupamento restantes, aqui 'sou'. Você pode verificar o agrupamento em cada etapa comgroups
.Obviamente, o resultado do peeling depende da ordem das variáveis de agrupamento na
group_by
chamada. Você pode querer fazer uma subseqüentegroup_by(am)
, para tornar seu código mais explícito.Para arredondamento e pré-certificação, consulte a boa resposta de @Tyler Rinker.
fonte
sum(n)
obras sobre oam
grupo e não ogear
grupo também ...summarise
dizer quais grupos restam. Oh dplyr rochas ...Você pode usar a
count()
função, que possui um comportamento diferente, dependendo da versão dodplyr
:dplyr 0.7.1: retorna uma tabela desagrupada : você precisa agrupar novamente por
am
dplyr <0.7.1: retorna uma tabela agrupada , portanto não há necessidade de agrupar novamente, embora você possa querer
ungroup()
manipular posteriormentedplyr 0.7.1
dplyr <0.7.1
Isso resulta em uma tabela agrupada . Se você deseja usá-la para análises adicionais, pode ser útil remover o atributo agrupado
ungroup()
.fonte
dplyr
0.7.1. Ele faz o cálculo da frequência geral em "engrenagem", em vez de dentro de cada nível de "am".O @ Henrik's é melhor para a usabilidade, pois isso tornará o caractere da coluna e não será mais numérico, mas corresponde ao que você pediu ...
EDITAR Porque Spacedman pediu :-)
fonte
format
método que adiciona um sinal de porcentagem ... #overkillAqui está uma função geral que implementa a solução de Henrik na
dplyr
versão 0.7.1.fonte
Error in bind_rows_(x, .id) : Column
am` não pode ser convertido de numérico para character`Eu escrevi uma pequena função para esta tarefa repetida:
Eu posso então usá-lo como:
Retorna:
fonte
Apesar das muitas respostas, mais uma abordagem usada
prop.table
em combinação comdplyr
oudata.table
.fonte
Esta resposta é baseada na resposta de Matifou.
Primeiro, modifiquei-o para garantir que não receba a coluna freq retornada como uma coluna de notação científica usando a opção scipen.
Em seguida, multiplico a resposta por 100 para obter uma porcentagem em vez de decimal para facilitar a leitura da coluna freq como porcentagem.
fonte