Usando table() com datas.

Boa noite a todos. Estou com uma duvida aqui sobre como fazer tabelas com dados de tempo. Bom eu tenho um dataframe que é uma lista de bixos atropelados na estrada. Cada linha é um registro, e tem a especie do bixinho que morreu e a data e outras coisas. Mais ou menos assim:
head(dados) Especie Data 1 Especie 1 2003-06-01 2 Especie 3 2001-06-01 3 Especie 1 2003-07-01 4 Especie 2 2004-02-01 5 Especie 3 2000-07-01 6 Especie 1 2002-06-01
Então tem varias especies, e varios anos de coleta. Eu gostaria de fazer uma tabela pra saber quantos individuos de cada especie morreram por mes, separando os anos. Eu fiz isso usando o comando table(), porem tem alguns meses que não teve registro para nenhuma especie. Dai a minha tabela fica incompleta. Eu gostaria que do periodo inicial dos registros até o final, tivesse todos os meses, mesmo que aparecendo zero para todas as especies. Segue um CMR pra exemplificar melhor o exemplo #gerando dados de exemplo: set.seed(5) datas<-seq(from =as.Date('1/1/2000',format='%d/%m/%Y'),to=as.Date('1/1/2005',format='%d/%m/%Y'),by='month') especies<-paste("Especie",1:3) dados<-data.frame(Especie=NA,Data=as.Date('1/1/2000',format='%d/%m/%Y')) for(i in 1:30) { dados[i,1]<-sample(especies,1) dados[i,2]<-sample(datas,1) } head(dados) #Fazendo a tabela table(format(dados$Data,'%m/%Y'),dados$Especie)
table(format(dados$Data,'%m/%Y'),dados$Especie)
Especie 1 Especie 2 Especie 3 01/2001 1 0 0 01/2002 0 1 0 01/2003 0 1 0 02/2000 1 0 0 02/2001 1 0 0 02/2004 0 1 0 03/2001 0 0 1 03/2003 0 0 1 04/2000 0 1 0 04/2001 1 0 0 04/2004 0 1 0 05/2000 0 0 1 06/2001 0 0 1 06/2002 3 0 0 06/2003 1 0 0 07/2000 0 0 1 07/2003 1 0 0 07/2004 0 1 0 08/2003 0 0 1 09/2000 1 0 0 09/2002 0 0 1 10/2002 0 0 1 11/2002 1 1 0 11/2004 1 1 0 12/2001 0 0 1 12/2004 0 0 1 Por exemplo ali onde destaquei em vermelho, tinha que ter o mes 2 pro ano de 2002 e 2003 Nos dados eu vejo que o trabalho acabou em 2004, dezembro
max(dados$Data) [1] "2004-12-01"
Mas começou em 2000, fevereiro.
min(dados$Data) [1] "2000-02-01"
Ou seja ta faltando muitos meses. Tem como o table completar isso automaticamente? Eu entendo que ele não completou esses meses pois não tem um registro, e eles não entraram como um nivel de fator. Mas eu gostaria que todos os meses, mesmo sem registros tivessem ali. A principio eu estava tentando fazer um vetor com os meses/anos, ai fazer uma tabela com zeros e usar o resultado do table pra preencher. mas imagino que essa não deve ser a solução mais inteligente. Alguém tem alguma sugestão? Abraços Augusto Ribas -- Grato Augusto C. A. Ribas Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056

library(lubridate) myFormat <- function(datas) paste(sprintf('%02d', month(datas)), sprintf('%04d', year(datas)), sep='/') dt <- ymd(format(dados$Data, '%Y-%m-%d')) theSeq <- seq(min(dt), max(dt), by='month') periodosFac <- factor(myFormat(dt), levels=sort(myFormat(theSeq))) table(periodosFac, dados$Especie) 2012/9/14 Augusto Ribas <ribas.aca@gmail.com>:
Boa noite a todos. Estou com uma duvida aqui sobre como fazer tabelas com dados de tempo. Bom eu tenho um dataframe que é uma lista de bixos atropelados na estrada. Cada linha é um registro, e tem a especie do bixinho que morreu e a data e outras coisas. Mais ou menos assim:
head(dados) Especie Data 1 Especie 1 2003-06-01 2 Especie 3 2001-06-01 3 Especie 1 2003-07-01 4 Especie 2 2004-02-01 5 Especie 3 2000-07-01 6 Especie 1 2002-06-01
Então tem varias especies, e varios anos de coleta. Eu gostaria de fazer uma tabela pra saber quantos individuos de cada especie morreram por mes, separando os anos. Eu fiz isso usando o comando table(), porem tem alguns meses que não teve registro para nenhuma especie. Dai a minha tabela fica incompleta. Eu gostaria que do periodo inicial dos registros até o final, tivesse todos os meses, mesmo que aparecendo zero para todas as especies. Segue um CMR pra exemplificar melhor o exemplo
#gerando dados de exemplo: set.seed(5) datas<-seq(from =as.Date('1/1/2000',format='%d/%m/%Y'),to=as.Date('1/1/2005',format='%d/%m/%Y'),by='month') especies<-paste("Especie",1:3)
dados<-data.frame(Especie=NA,Data=as.Date('1/1/2000',format='%d/%m/%Y')) for(i in 1:30) { dados[i,1]<-sample(especies,1) dados[i,2]<-sample(datas,1) }
head(dados)
#Fazendo a tabela table(format(dados$Data,'%m/%Y'),dados$Especie)
table(format(dados$Data,'%m/%Y'),dados$Especie)
Especie 1 Especie 2 Especie 3 01/2001 1 0 0 01/2002 0 1 0 01/2003 0 1 0 02/2000 1 0 0 02/2001 1 0 0 02/2004 0 1 0 03/2001 0 0 1 03/2003 0 0 1 04/2000 0 1 0 04/2001 1 0 0 04/2004 0 1 0 05/2000 0 0 1 06/2001 0 0 1 06/2002 3 0 0 06/2003 1 0 0 07/2000 0 0 1 07/2003 1 0 0 07/2004 0 1 0 08/2003 0 0 1 09/2000 1 0 0 09/2002 0 0 1 10/2002 0 0 1 11/2002 1 1 0 11/2004 1 1 0 12/2001 0 0 1 12/2004 0 0 1
Por exemplo ali onde destaquei em vermelho, tinha que ter o mes 2 pro ano de 2002 e 2003 Nos dados eu vejo que o trabalho acabou em 2004, dezembro
max(dados$Data) [1] "2004-12-01"
Mas começou em 2000, fevereiro.
min(dados$Data) [1] "2000-02-01"
Ou seja ta faltando muitos meses. Tem como o table completar isso automaticamente? Eu entendo que ele não completou esses meses pois não tem um registro, e eles não entraram como um nivel de fator. Mas eu gostaria que todos os meses, mesmo sem registros tivessem ali. A principio eu estava tentando fazer um vetor com os meses/anos, ai fazer uma tabela com zeros e usar o resultado do table pra preencher. mas imagino que essa não deve ser a solução mais inteligente. Alguém tem alguma sugestão?
Abraços Augusto Ribas -- Grato Augusto C. A. Ribas
Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056
_______________________________________________ R-br mailing list R-br@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.

Ola Benilton, funcionou perfeitamente. Eu so não entendi perfeitamente a função myFormat que vc fez. Ela pega as datas e troca - por /. PQ o ymd transforma os dados em data pro pacote lubridate correto? Mas ai vc usa o myFormat ali no comando factor. Fiquei perdido no que esta acontecendo. Porque não funciona somente fazer a seq() com as datas minima e maxima por mes e usar no levels. Mas desde ja agradeço a sua atenção :) Em 13 de setembro de 2012 21:31, Benilton Carvalho < beniltoncarvalho@gmail.com> escreveu:
library(lubridate) myFormat <- function(datas) paste(sprintf('%02d', month(datas)), sprintf('%04d', year(datas)), sep='/') dt <- ymd(format(dados$Data, '%Y-%m-%d')) theSeq <- seq(min(dt), max(dt), by='month') periodosFac <- factor(myFormat(dt), levels=sort(myFormat(theSeq))) table(periodosFac, dados$Especie)
2012/9/14 Augusto Ribas <ribas.aca@gmail.com>:
Boa noite a todos. Estou com uma duvida aqui sobre como fazer tabelas com dados de tempo. Bom eu tenho um dataframe que é uma lista de bixos atropelados na estrada. Cada linha é um registro, e tem a especie do bixinho que morreu e a data e outras coisas. Mais ou menos assim:
head(dados) Especie Data 1 Especie 1 2003-06-01 2 Especie 3 2001-06-01 3 Especie 1 2003-07-01 4 Especie 2 2004-02-01 5 Especie 3 2000-07-01 6 Especie 1 2002-06-01
Então tem varias especies, e varios anos de coleta. Eu gostaria de fazer uma tabela pra saber quantos individuos de cada especie morreram por mes, separando os anos. Eu fiz isso usando o comando table(), porem tem alguns meses que não teve registro para nenhuma especie. Dai a minha tabela fica incompleta. Eu gostaria que do periodo inicial dos registros até o final, tivesse todos os meses, mesmo que aparecendo zero para todas as especies. Segue um CMR pra exemplificar melhor o exemplo
#gerando dados de exemplo: set.seed(5) datas<-seq(from
=as.Date('1/1/2000',format='%d/%m/%Y'),to=as.Date('1/1/2005',format='%d/%m/%Y'),by='month')
especies<-paste("Especie",1:3)
dados<-data.frame(Especie=NA,Data=as.Date('1/1/2000',format='%d/%m/%Y')) for(i in 1:30) { dados[i,1]<-sample(especies,1) dados[i,2]<-sample(datas,1) }
head(dados)
#Fazendo a tabela table(format(dados$Data,'%m/%Y'),dados$Especie)
table(format(dados$Data,'%m/%Y'),dados$Especie)
Especie 1 Especie 2 Especie 3 01/2001 1 0 0 01/2002 0 1 0 01/2003 0 1 0 02/2000 1 0 0 02/2001 1 0 0 02/2004 0 1 0 03/2001 0 0 1 03/2003 0 0 1 04/2000 0 1 0 04/2001 1 0 0 04/2004 0 1 0 05/2000 0 0 1 06/2001 0 0 1 06/2002 3 0 0 06/2003 1 0 0 07/2000 0 0 1 07/2003 1 0 0 07/2004 0 1 0 08/2003 0 0 1 09/2000 1 0 0 09/2002 0 0 1 10/2002 0 0 1 11/2002 1 1 0 11/2004 1 1 0 12/2001 0 0 1 12/2004 0 0 1
Por exemplo ali onde destaquei em vermelho, tinha que ter o mes 2 pro ano de 2002 e 2003 Nos dados eu vejo que o trabalho acabou em 2004, dezembro
max(dados$Data) [1] "2004-12-01"
Mas começou em 2000, fevereiro.
min(dados$Data) [1] "2000-02-01"
Ou seja ta faltando muitos meses. Tem como o table completar isso automaticamente? Eu entendo que ele não completou esses meses pois não tem um registro, e eles não entraram como um nivel de fator. Mas eu gostaria que todos os meses, mesmo sem registros tivessem ali. A principio eu estava tentando fazer um vetor com os meses/anos, ai fazer uma tabela com zeros e usar o resultado do table pra preencher. mas imagino que essa não deve ser a solução mais inteligente. Alguém tem alguma sugestão?
Abraços Augusto Ribas -- Grato Augusto C. A. Ribas
Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056
_______________________________________________ R-br mailing list R-br@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@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.
-- Grato Augusto C. A. Ribas Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056

reenviando... myFormat() apenas formata a data para mes/ano... mas agora que estou acordado, nem precisava do lubridate, ne'? Abaixo a solucao sem frescura: theSeq <- with(dados, sort(format(seq(min(Data), max(Data), by='month'), '%m/%Y'))) with(dados, table(factor(format(Data, '%m/%Y'), levels=theSeq), Especie)) b 2012/9/14 Augusto Ribas <ribas.aca@gmail.com>:
Ola Benilton, funcionou perfeitamente. Eu so não entendi perfeitamente a função myFormat que vc fez. Ela pega as datas e troca - por /. PQ o ymd transforma os dados em data pro pacote lubridate correto? Mas ai vc usa o myFormat ali no comando factor. Fiquei perdido no que esta acontecendo. Porque não funciona somente fazer a seq() com as datas minima e maxima por mes e usar no levels. Mas desde ja agradeço a sua atenção :)
Em 13 de setembro de 2012 21:31, Benilton Carvalho <beniltoncarvalho@gmail.com> escreveu:
library(lubridate) myFormat <- function(datas) paste(sprintf('%02d', month(datas)), sprintf('%04d', year(datas)), sep='/') dt <- ymd(format(dados$Data, '%Y-%m-%d')) theSeq <- seq(min(dt), max(dt), by='month') periodosFac <- factor(myFormat(dt), levels=sort(myFormat(theSeq))) table(periodosFac, dados$Especie)
2012/9/14 Augusto Ribas <ribas.aca@gmail.com>:
Boa noite a todos. Estou com uma duvida aqui sobre como fazer tabelas com dados de tempo. Bom eu tenho um dataframe que é uma lista de bixos atropelados na estrada. Cada linha é um registro, e tem a especie do bixinho que morreu e a data e outras coisas. Mais ou menos assim:
head(dados) Especie Data 1 Especie 1 2003-06-01 2 Especie 3 2001-06-01 3 Especie 1 2003-07-01 4 Especie 2 2004-02-01 5 Especie 3 2000-07-01 6 Especie 1 2002-06-01
Então tem varias especies, e varios anos de coleta. Eu gostaria de fazer uma tabela pra saber quantos individuos de cada especie morreram por mes, separando os anos. Eu fiz isso usando o comando table(), porem tem alguns meses que não teve registro para nenhuma especie. Dai a minha tabela fica incompleta. Eu gostaria que do periodo inicial dos registros até o final, tivesse todos os meses, mesmo que aparecendo zero para todas as especies. Segue um CMR pra exemplificar melhor o exemplo
#gerando dados de exemplo: set.seed(5) datas<-seq(from
=as.Date('1/1/2000',format='%d/%m/%Y'),to=as.Date('1/1/2005',format='%d/%m/%Y'),by='month') especies<-paste("Especie",1:3)
dados<-data.frame(Especie=NA,Data=as.Date('1/1/2000',format='%d/%m/%Y')) for(i in 1:30) { dados[i,1]<-sample(especies,1) dados[i,2]<-sample(datas,1) }
head(dados)
#Fazendo a tabela table(format(dados$Data,'%m/%Y'),dados$Especie)
table(format(dados$Data,'%m/%Y'),dados$Especie)
Especie 1 Especie 2 Especie 3 01/2001 1 0 0 01/2002 0 1 0 01/2003 0 1 0 02/2000 1 0 0 02/2001 1 0 0 02/2004 0 1 0 03/2001 0 0 1 03/2003 0 0 1 04/2000 0 1 0 04/2001 1 0 0 04/2004 0 1 0 05/2000 0 0 1 06/2001 0 0 1 06/2002 3 0 0 06/2003 1 0 0 07/2000 0 0 1 07/2003 1 0 0 07/2004 0 1 0 08/2003 0 0 1 09/2000 1 0 0 09/2002 0 0 1 10/2002 0 0 1 11/2002 1 1 0 11/2004 1 1 0 12/2001 0 0 1 12/2004 0 0 1
Por exemplo ali onde destaquei em vermelho, tinha que ter o mes 2 pro ano de 2002 e 2003 Nos dados eu vejo que o trabalho acabou em 2004, dezembro
max(dados$Data) [1] "2004-12-01"
Mas começou em 2000, fevereiro.
min(dados$Data) [1] "2000-02-01"
Ou seja ta faltando muitos meses. Tem como o table completar isso automaticamente? Eu entendo que ele não completou esses meses pois não tem um registro, e eles não entraram como um nivel de fator. Mas eu gostaria que todos os meses, mesmo sem registros tivessem ali. A principio eu estava tentando fazer um vetor com os meses/anos, ai fazer uma tabela com zeros e usar o resultado do table pra preencher. mas imagino que essa não deve ser a solução mais inteligente. Alguém tem alguma sugestão?
Abraços Augusto Ribas -- Grato Augusto C. A. Ribas
Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056
_______________________________________________ R-br mailing list R-br@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@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.
-- Grato Augusto C. A. Ribas
Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056
_______________________________________________ R-br mailing list R-br@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.
participantes (2)
-
Augusto Ribas
-
Benilton Carvalho