este post dá uma breve revisão da função agregada utilizada para os dados.frames e apresenta alguns usos interessantes: do trivial, mas útil, aos problemas mais complicados que resolvi com o agregado.
Aggregate
é uma função na base R que pode, como o nome sugere, agregar o inputted data.frame
D. f aplicando uma função especificada pelo parâmetro FUN
a cada coluna de sub-dados.quadros definidos pelo parâmetro de entrada by
.
o parâmetro by
tem de ser um list
. No entanto, uma vez que data.frame
‘s são tratadas como (nomeadas) listas de colunas, uma ou mais colunas de um data.frame
também podem ser passadas como o parâmetro by
. Curiosamente, se estas colunas são do mesmo data.frame
como o que é inputado como x
, essas colunas não são passadas para a função FUN
.
a função a aplicar tem de ser capaz de aceitar um vector
(uma vez que será chamado com partes de uma coluna de uma data.frame
como entrada).
os sub-dados.os quadros definidos pelo parâmetro de entrada by
podem ser considerados como indexação lógica:
d.f <- data.frame(rating = c("AAA", "A", "A", "AAA", "BB", "BB", "AAA", "A"))i <- 1by <- d.f$ratingsub.data.frame <- d.f, ]
e fazer isto para cada i
entre 1 e length(unique(by))
. Note que a variável by
não tem que concordar com uma (ou mais) coluna da data.frame
mas pode ser qualquer coisa. Assim, pode-se reproduzir a funcionalidade aggregate
por um ciclo for
rodando a variável ciclo sobre os valores únicos da variável passada como by
e um sapply
aplicando a função passada como FUN
a cada coluna do sub.dado.quadro. Tal solução seria, no entanto, muito difícil de documentar, pois não seria claro o que (e por que) este código está realmente fazendo.
Aggregate
devolve sempre um data.frame
como resultado. Este data.frame
conterá os valores (agora únicos) do parâmetro de entrada by
como a primeira coluna e, em seguida, colunas contendo os resultados da chamada para a função no parâmetro FUN
aplicado às partes das colunas do inputted data.frame
. É interessante notar que, se a função data.frame
será list
ou algo um list
pode ser convertido (ver o último exemplo abaixo).
é importante notar que a chamada de função é aplicada a nameless vetores em vez de colunas nomeadas de um data.frame
e, portanto, referindo-se aos nomes dos data.frame
não funcionará, nem a coluna de referências tais como s.d.f
.
exemplos básicos
os usos mais básicos do agregado envolvem funções de base tais como mean
e sd
. É de fato um dos usos mais comuns de aggregate
para comparar a média ou outras propriedades de grupos de amostra.
recentemente reproduzi cálculos a partir de uma folha do Excel. A maioria das fórmulas eram subtotais e grandes totais. A folha do Excel não foi muito confortavelmente organizada para este propósito: somas sobre linhas, colunas e totais dessas somas foram usados. Em R, eu ter alterado os dados para um esquema em estrela de representação (quando todos os metadados são representados linha-sábio e todo valor é a sua própria linha) usando reshape2
pacote e melt
, em seguida, usado aggregate
ao longo de diferentes variáveis para obter os totais diferentes. Quanto menos variáveis você usar em by
, mais agregado o resultado final: o total geral ao longo de uma dimensão é simplesmente usar essa dimensão Como “by”, enquanto os subtotais podem ser alcançados usando múltiplas variáveis como by
. A FUN
neste caso foi, naturalmente, sum
.
uma utilização útil do agregado e uma função base está a obter o número de aparências dos vários valores:
o meu uso favorito de agregado com uma função base está a obter o último dia de cada mês numa série de datas. Para isso, pode-se usar o seguinte código (assumindo que suas datas são armazenadas em um formato “AAAA-MM-DD” como strings ou como Date
):
isto veio a ser muito útil quando se trabalha com informações bancárias onde o último dia do mês dependia de feriados bancários, bem como fins de semana.
utilizações avançadas
utilizações mais avançadas de aggregate
dependem da escrita própria function
, por exemplo, funções anônimas passadas como parâmetro FUN
. Para isso, pode-se usar a sintaxe
# do not run the syntaxaggregate(x = d.f, by = by.list, FUN = function(s.d.f){y <- s.d.f; return(y)}
os possíveis usos variam de chamar métricas de risco de portfólio complexas para os grupos de risco homogêneos de um portfólio através da adaptação de uma distribuição a categorias de amostras para qualquer coisa que você possa imaginar, realmente.
aqui está um exemplo com uma métrica de risco de carteira” complexa ” (exposição a diferentes contrapartes em diferentes classes de ativos):
aqui está o uso da função aggregate()
.
Next up: fitting a Gaussian distribution to observations by categories:
Below we use the aggregate()
function to find the mean and standard deviation by categories.
este último exemplo mostra várias propriedades interessantes. Primeiro, as variáveis data.frame
a aggregate
e a lista de variáveis by
não precisam ser as mesmas. Enquanto isso está implícito em outros lugares do post, Este é um exemplo explícito de tal configuração. Em segundo lugar, a função passada como FUN
não é apenas uma função anônima, é curriada de uma função com mais de um parâmetro de entrada. Uma função de uma única variável de entrada observations
foi criada a partir da função variável de duas entradas fitdistr
: fixar uma das variáveis de entrada ajustando densfun = "normal"
. Em terceiro lugar, ao invés de retornar o valor total de retorno da função fitdistr
, o valor de retorno é restrito ao elemento estimate
do valor de retorno. E por último, mas não menos importante, o valor de retorno da função anônima passada para FUN
consiste em duas variáveis e não apenas uma. Curiosamente, o agregado lança o valor de retorno de list
a matrix
e nomeia os elementos para nós. No entanto, esses nomes não podem ser usados para referenciar as colunas da matriz. Pode, no entanto, referi-las da seguinte forma::
distr.estimate$observation] 3.016988
Palavras Finais
espero que tenha achado o acima útil. Agora que você está mais familiarizado com aggregate
, é hora da verdade: tudo acima e muito mais pode ser feito com data.table
, e com um desempenho muito mais rápido. No entanto, data.table
tem uma sintaxe complexa e é preciso realmente entender como as coisas funcionam sob o capô, enquanto aggregate
é simples e perspicaz. Até que você esteja confortável com a lógica de agregação e a sintaxe de data.table
, é um investimento digno de Primeiro escrever o código usando aggregate
e, em seguida, otimizá-lo, reescrevendo-o usando data.table
.
para aqueles de vocês que estão interessados, um post dedicado está vindo onde o acima é refeito com data.table
, juntamente com alguns casos de uso adicionais específicos para data.table
.