Tenho um dataframe e gostaria de contar o número de linhas dentro de cada grupo. Eu regularmente uso a aggregate
função para somar os dados da seguinte forma:
df2 <- aggregate(x ~ Year + Month, data = df1, sum)
Agora, eu gostaria de contar observações, mas não consigo encontrar o argumento adequado para FUN
. Intuitivamente, pensei que seria o seguinte:
df2 <- aggregate(x ~ Year + Month, data = df1, count)
Mas, não tive essa sorte.
Alguma ideia?
Alguns dados do brinquedo:
set.seed(2)
df1 <- data.frame(x = 1:20,
Year = sample(2012:2014, 20, replace = TRUE),
Month = sample(month.abb[1:3], 20, replace = TRUE))
nrow
,NROW
,length
...nrow
não funcionou para mim, masNROW
elength
bem trabalhado. +1Respostas:
A prática recomendada atual (tidyverse) é:
fonte
cbind
os resultados deaggregate(Sepal.Length ~ Species, iris, mean)
eaggregate(Sepal.Length ~ Species, iris, length)
df %>% group_by(group, variable) %>% mutate(count = n())
Seguindo a sugestão de
df
@Joshua , aqui está uma maneira de contar o número de observações em seu dataframe ondeYear
= 2007 eMonth
= Nov (assumindo que sejam colunas):e com
aggregate
, a seguir @GregSnow:fonte
dplyr
pacote faz isso comcount
/tally
comandos ou an()
função :Primeiro, alguns dados:
Agora a contagem:
Também podemos usar uma versão um pouco mais longa com tubulação e a
n()
função:ou a
tally
função:fonte
Uma velha questão sem
data.table
solução. Então aqui vai ...Usando
.N
fonte
.()
vez delist()
esetDT()
para converter um data.frame em data.table. Então, em uma etapasetDT(df)[, .N, by = .(year, month)]
.A opção simples de usar
aggregate
é alength
função que fornecerá o comprimento do vetor no subconjunto. Às vezes é um pouco mais robusto de usarfunction(x) sum( !is.na(x) )
.fonte
Crie uma nova variável
Count
com valor 1 para cada linha:Em seguida, agregue dataframe, somando pela
Count
coluna:fonte
aggregate
, não há necessidade de renomear cada variávelby=
comolist(year=df1$year)
etc. A jádata.frame
é um,list
entãoaggregate(df1[c("Count")], by=df1[c("Year", "Month")], FUN=sum, na.rm=TRUE)
funcionará.Uma alternativa para a
aggregate()
função neste caso seriatable()
comas.data.frame()
, que também indicaria quais combinações de ano e mês estão associadas a zero ocorrênciasE sem as combinações de ocorrência zero
fonte
Se quiser incluir 0 contagens para meses-anos que estão faltando nos dados, você pode usar um pouco de
table
mágica.Por exemplo, o brinquedo data.frame na pergunta, df1, não contém observações de janeiro de 2014.
A
aggregate
função base R não retorna uma observação para janeiro de 2014.Se desejar uma observação deste mês-ano com 0 como contagem, o código acima retornará um data.frame com contagens para todas as combinações mês-ano:
fonte
Para minhas agregações, geralmente acabo querendo ver a média e "quão grande é este grupo" (também conhecido como comprimento). Portanto, este é o meu trecho útil para essas ocasiões;
fonte
UMA sqlsolução usando
sqldf
pacote:fonte
Considerando a resposta @Ben, R geraria um erro se
df1
não contiverx
coluna. Mas pode ser resolvido elegantemente compaste
:Da mesma forma, pode ser generalizado se mais de duas variáveis forem usadas no agrupamento:
fonte
Você pode usar
by
funções, poisby(df1$Year, df1$Month, count)
isso produzirá uma lista de agregações necessárias.A saída será semelhante a
fonte
Já existem muitas respostas maravilhosas aqui, mas eu gostaria de acrescentar mais 1 opção para aqueles que desejam adicionar uma nova coluna ao conjunto de dados original que contém o número de vezes que essa linha é repetida.
O mesmo pode ser feito combinando qualquer uma das respostas acima com a
merge()
função.fonte
Se você está tentando as soluções agregadas acima e obtém o erro:
tipo inválido (lista) para variável
Como você está usando carimbos de data ou data e hora, tente usar as.character nas variáveis:
Em uma ou ambas as variáveis.
fonte