Agregado – uma ferramenta poderosa para o quadro de dados em R

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 retorna vários valores, a classe das colunas do resultado 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.

Deixe uma resposta

O seu endereço de email não será publicado.