[R-br] Assunto: Classificar um conjunto de dados

Jônatan jdtatsch em gmail.com
Sex Nov 9 19:54:33 -02 2018


Com os dados estruturados pelo Fernando, tentei com 2 alternativas:

# versão com tidyverse
library(dplyr); library(lubridate)
res_dplyr <- dados %>%
  group_by(ano = year(Data), Local) %>%
  arrange(desc(Frequencia), desc(Data), desc(qtde)) %>%
  slice(1) %>%
  ungroup()
res_dplyr

# versão base do R
res_base <- lapply(
  split(dados, f = list(dados$Local, year(dados$Data))),
  function(x) {
    o <- with(x, order(Frequencia, Data, qtde, decreasing = TRUE))
    x[o, ][1, ]
  }
)
res_base <- do.call(rbind, res_base)
res_base

Att.

On Thu, Nov 8, 2018 at 9:47 PM Edson Lira por (R-br) <
r-br em listas.c3sl.ufpr.br> wrote:

> ###################CONTAGEM DE DOADORES###########################
> #COM ESSA ROTINA ABAIXO, VC ORDENA DO MAIOR PARA O MAIOR AS DUAS VARIÁVEIS
> d_cad0_10<- tip_doa[order(tip_doa$NUMEROGENTE,tip_doa$DATAHORADOACAO,
> decreasing=TRUE) ,]
>
> NA ROTINA ABAIXO VC MANTEM AS DUPLICADAS E MANTEM SOMENTE A DE MAIOR
> FREQUÊNCIA
> dc_0_10<- d_cad0_10[!duplicated(d_cad0_10$NUMEROGENTE),]
>
>
> USEI ESSA ROTINA EM UM BANCO DE DOADORES AQUI DE MANAUS PARA MANTER
> SOMENTE SOMENTE ELE UMA VEZ, E COMO ORDENEI ELE MANTINHA O PRIMEIRO
> REGISTRO DOS DUPLICADOS E O PRIMEIRO ERA O DE MAIOR FREQUÊNCIA. ACHO QUE
> ERA ISSO.
>
> TESTE ESSA.
>
>
>
> [  ]'s
> Prof. Edson Lira, Me
> Estatístico
> Manaus-Amazonas
>
>
> Em quinta-feira, 8 de novembro de 2018 18:29:43 AMT, Fernando Souza por
> (R-br) <r-br em listas.c3sl.ufpr.br> escreveu:
>
>
> Cara criei esse comando que aproxima bem do que você deseja,
> Porém a última situaçao (Local=D) não estou conseguindo programar, veja se
> tem alguma idéia que possa complementar.
>
> att
>
>
> dados<-data.frame(Local=c('A','A','A','B','C','C','C','C','D','D'),Frequencia=c(2,2,1,3,5,5,5,5,3,4),Data=c("13/05/2015","13/05/2015","13/05/2015","13/05/2015","13/05/2015","10/05/2015","13/05/2015","13/05/2015","13/05/2015","13/05/2015"),qtde=c(500,700,700,400,300,400,400,900,550,500))
> dados$Data <-as.Date(dados$Data,"%d/%m/%Y")
> str(dados)
> dados
>
> # install.packages("plyr")
> library(plyr)
>
> arranjo<-function(x){
> valido <- c()
> for(i in 1:nrow(x)){
> if(x[i,2]==max(x[,2])){
> valido[i]<-1
> if( x[i,3]>= max(x[,3]) & x[i,2]==max(x[,2])){
>
> valido[i] <-1
> }else{
>
> valido[i] <- 0
>
> }
> if(x[i,4]>= max(x[,4])){
> valido[i] <- 1
> }else{
>
> valido[i] <- 0
> }
> }else{
> valido[i]=0
> }
> }
> return(mutate(x,valido=valido))
> }
>
> ddply(dados,.(Local, Data),arranjo)
>
>
>
>
> On Nov 7 2018, at 11:29 am, Yury Duarte por (R-br) <
> r-br em listas.c3sl.ufpr.br> wrote:
>
>
> Olá Daniel!
>
> Utilizei a abordagem que você sugeriu e criei dois laços para fazer a
> checagem.
> Ainda não está exatamente como gostaria mas o filtro já está sendo feito
> da maneira que preciso.
> Segue a estrutura utilizada.
>
> Obrigado!
>
> Abraços
>
> dados:
> area_id dia mes  ano frequencia valor
> a  15   12 2012         10     5
> a  22   12 2012         15    10
> a  15   12 2012         12    15
> a  24   11 2013         15    20
> b   8   12 2013         10     5
> b  14   10 2012         12    10
> c   7   11 2012         15     5
> c  19   11 2013         12    10
> c  19   10 2014         12    15
> c  19   10 2013         15    20
> d   5   10 2014         10     5
> d  23   10 2014         10    10
> d   5   12 2012         10    15
> d   5   12 2012         15    20
> d   5   12 2013         12    25
> d   6   11 2014         12    30
>
> estrutura:
> #--------------------Remover Objetos do R--------------------#
> rm(list = ls())
> set.seed(29031989)
>
> raiz = 'C:\\Users\\Desktop\\'
> a = read.table(paste0(raiz, 'teste_classificacao_final.txt'), header = T,
> sep = '\t')
> colunas = colnames(a)
> locais = data.frame(unique(a$area_id))
>
> for (i in 1:length(locais[,1])){
>   #nome = paste0("area_", locais[i,1])
>   #area = assign(nome, a[which(a$area_id==locais[i,1]),])
>   area = a[which(a$area_id==locais[i,1]),]
>   anos = data.frame(unique(area$ano))
>
>   for (x in 1:length(anos[,1])) {
>     area_ano = area[which(area$ano==anos[x,1]),]
>     frequencia_max = max(area_ano$frequencia)
>     valor_max = max(area_ano$valor)
>     area_ano_freq = area_ano[which(area_ano$frequencia==frequencia_max),]
>     area_ano_freq_val =
> area_ano_freq[which(area_ano_freq$frequencia==frequencia_max),]
>
>     write.table(area_ano_freq_val, paste0(raiz, 'teste', '.txt'), sep =
> "\t", append = T, col.names = F, row.names = F)
>
>   }
> }
>
> b = read.table(paste0(raiz, 'teste.txt'), header = F, sep = '\t')
> colnames(b) = colunas
>
> Yury Duarte
> Engenheiro Agrônomo - ESALQ/USP
>
>
> Em qua, 7 de nov de 2018 às 09:26, Daniel Guimarães Tiezzi por (R-br) <
> r-br em listas.c3sl.ufpr.br> escreveu:
>
> Uma opção eh usar Uma estrutura de repetição para checar as variaveis e
> retornar o valor q deseja
>
> Daniel
>
> On Wed, 7 Nov 2018, 09:22 Yury Duarte por (R-br) <r-br em listas.c3sl.ufpr.br
> wrote:
>
> Bom dia colegas listeiros,
>
> Edson, agradeço pela dica! Já tinha me esquecido da possibilidade de
> utilizar aggregate nos meus comandos.
> Entretanto, tentei utilizar a função sugerida para resolver o problema mas
> não consegui adapta-la para a minha necessidade.
> Quando utilizo o aggregate ele me pede uma 'function' para ser aplicada
> aos dados, de acordo com a ordem de agrupamento estabelecida dentro do
> argumento 'by', mas não não consegui adaptar uma função que me retornasse
> um boleano de mesmo valor/significado da coluna 'valido' (que gerei
> manualmente para validar os resultados do código). Consegui agregar os
> locais por área e por data quando pedi para retornar a média das
> frequências ou das quantidades, mas isso não me ajuda muito no momento.
>
> aggregate(dados$local, by = list(dados$data), 'função')
>
> Desde já, agradeço pela ajuda de todos!
>
> Yury Duarte
> Engenheiro Agrônomo - ESALQ/USP
>
>
> Em ter, 6 de nov de 2018 às 18:21, Edson Lira por (R-br) <
> r-br em listas.c3sl.ufpr.br> escreveu:
>
> Dá uma olhada no aggregate
>
> Enviado do Yahoo Mail no Android
> <https://go.onelink.me/107872968?pid=InProduct&c=Global_Internal_YGrowth_AndroidEmailSig__AndroidUsers&af_wl=ym&af_sub1=Internal&af_sub2=Global_YGrowth&af_sub3=EmailSignature>
>
> <div>Em ter, 6 6e nov 6e 2018 às 15:25, Yury Duarte por (R-br)</div><div><
> r-br em listas.c3sl.ufpr.br> escreveu:</div>
> Boa tarde colegas listeiros, como vão?
>
> Tenho um problema e estou com certa dificuldade em resolver de forma
> prática. Meu conjunto de dados é o seguinte:
> local frequencia data quantidade *valido*
> A 2 13/05/2015 500,00 *0*
> A 2 13/05/2015 700,00 *1*
> A 1 13/05/2015 700,00 *0*
> B 3 13/05/2015 400,00 *1*
> C 5 13/05/2015 300,00 *0*
> C 5 10/05/2015 400,00 *0*
> C 5 13/05/2016 400,00 *1*
> C 5 13/05/2015 900,00 *1*
> D 3 13/05/2015 550,00 *0*
> D 4 13/05/2015 500,00 *1*
>
> Para esse conjunto, gostaria de gerar a coluna 'valida', que me classifica
> os dados da seguinte maneira: para cada local e para cada ano, retornar
> apenas o local de maior frequência, mais recente e de maior quantidade
> (nessa ordem).
> Pensei em gerar um objeto para cada local a partir do which(), mas como
> meu conjunto de dados tem mais de 150 mil linhas e mais de 2000 locais,
> achei que essa abordagem não seria muito prática nem rápida de ser
> processada.
>
> Desde já, agradeço pela colaboração de todos!
>
> Att
>
> Yury Duarte
> Engenheiro Agrônomo - ESALQ/USP
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a
> c�digo m�nimo reproduz�vel.
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a
> c�digo m�nimo reproduz�vel.
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne�a
> c�digo m�nimo reproduz�vel.
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.



-- 
###############################################################
##  Jônatan Dupont Tatsch
##  Professor do Departamento de Física
##  Centro de Ciências Exatas e Naturais (CCNE)
##  Universidade Federal de Santa Maria - UFSM
##  Faixa de Camobi, Prédio 13 - Campus UFSM - Santa Maria, RS, Brasil -
97105-900
##  Telefone: +55(55)33012083
##  www.ufsm.br/meteorologia
###############################################################
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20181109/aafd45c7/attachment.html>


Mais detalhes sobre a lista de discussão R-br