Trabalhar com subsets de data frame

Caros, bom dia, Eu estou com um data frame da forma : "data" "hora" "bid" "bidQ" "ask" "askQ" "last" "volume" "1" 2004-01-04 "09:30" -1 -1 -1 -1 38 55900 "2" 2004-01-04 "09:30" -1 -1 -1 -1 38 600 "3" 2004-01-04 "09:31" -1 -1 -1 -1 38 5000 "4" 2004-01-04 "09:31" 38.05 32 38.08 1 38.05 6000 "5" 2004-01-04 "09:31" 38.06 2 38.08 1 38.06 1500 "6" 2004-01-04 "09:31" 38.06 4 38.07 1 38.06 500 "7" 2004-01-04 "09:32" 38.04 1 38.07 1 38.05 4500 "8" 2004-01-04 "09:32" 38 1 38.2 1 38.03 1600 "9" 2004-01-04 "09:32" 38 1 38.2 1 38.03 3800 "10" 2004-01-04 "09:32" 38 1 38.04 1 38.04 500 "11" 2004-01-04 "09:32" 38 1 38.07 1 38.03 200 "12" 2004-01-04 "09:32" 38 1 38.08 2 38.07 100 "13" 2004-01-04 "09:32" 38 1 38.08 2 38.01 5000 "14" 2004-01-04 "09:32" 38 21 38.08 2 38.05 200 "15" 2004-01-04 "09:33" 38.03 9 38.13 8 38.08 700 "16" 2004-01-04 "09:33" 38.08 15 38.13 8 38.08 100 "17" 2004-01-04 "09:33" 38.11 16 38.13 10 38.12 900 onde as datas vão de 2004-01-04 até 2013-06-30 e os horários de 09:30 até 16:10. Eu tenho que achar o volume médio para cada minuto e depois normalizar esses volumes para cada minuto pelo volume médio. Eu tento montar um programa cheio de for() para data e for() para horário mas não está dando certo… Acho que deve ter uma lógica mais simples. Alguém saberia me dar uma dica? Muito obrigada! Michelle

Ola. Talvez se você informar como está lendo seu dados ajude, imagino que está tudo como charater, mas você pode passar esses dados para algum formato de tempo, por exemplo o posix do R, mas tem pacotes so com coisas de tempo também que podem te dar soluções até mais faceis. Mas segue uma solução que talvez ajude. #veja como é o tempo no R Sys.time() #criando seu vetor de indices #de um ?as.POSIXct, veja uns exemplos, para converter suas colunas para tempo no formato do posix #Dai vc precisa de um tempo inicial, vamos supor agora inicio <- as.POSIXct("2015-11-10 09:31:18 AMST") #O fim das suas coletas, daqui 30 min por exeplo fim <- inicio + as.difftime(30, units="mins") #e vc cria um vetor de min em min, mas poderia ser qq intervalo, de 5 em 5 min, so mudar o by indice<-seq(from=inicio, by=as.difftime(1, units="mins"), to=fim) #gerando alguns dados de exemplo medida<-rnorm(100,10,2) horario<-indice[sample(1:length(indice),100,replace=T)] dados<-data.frame(medida,horario) #veja os dados, imagino que no final vc vai ter medidas e o tempo dados #agora da pra usar cut com o indice para juntar seus dados e aggregate da forma convencional aggregate(dados$medida,list(cut(dados$horario,indice[-1])),mean) #ai pra normalizar, fazer outras operações, é so ir usando o fator que o cut gera pra vc Em 10 de novembro de 2015 09:14, Michelle Bau Graczyk <mbgraczyk@gmail.com> escreveu:
Caros, bom dia,
Eu estou com um data frame da forma : "data" "hora" "bid" "bidQ" "ask" "askQ" "last" "volume" "1" 2004-01-04 "09:30" -1 -1 -1 -1 38 55900 "2" 2004-01-04 "09:30" -1 -1 -1 -1 38 600 "3" 2004-01-04 "09:31" -1 -1 -1 -1 38 5000 "4" 2004-01-04 "09:31" 38.05 32 38.08 1 38.05 6000 "5" 2004-01-04 "09:31" 38.06 2 38.08 1 38.06 1500 "6" 2004-01-04 "09:31" 38.06 4 38.07 1 38.06 500 "7" 2004-01-04 "09:32" 38.04 1 38.07 1 38.05 4500 "8" 2004-01-04 "09:32" 38 1 38.2 1 38.03 1600 "9" 2004-01-04 "09:32" 38 1 38.2 1 38.03 3800 "10" 2004-01-04 "09:32" 38 1 38.04 1 38.04 500 "11" 2004-01-04 "09:32" 38 1 38.07 1 38.03 200 "12" 2004-01-04 "09:32" 38 1 38.08 2 38.07 100 "13" 2004-01-04 "09:32" 38 1 38.08 2 38.01 5000 "14" 2004-01-04 "09:32" 38 21 38.08 2 38.05 200 "15" 2004-01-04 "09:33" 38.03 9 38.13 8 38.08 700 "16" 2004-01-04 "09:33" 38.08 15 38.13 8 38.08 100 "17" 2004-01-04 "09:33" 38.11 16 38.13 10 38.12 900
onde as datas vão de 2004-01-04 até 2013-06-30 e os horários de 09:30 até 16:10. Eu tenho que achar o volume médio para cada minuto e depois normalizar esses volumes para cada minuto pelo volume médio. Eu tento montar um programa cheio de for() para data e for() para horário mas não está dando certo… Acho que deve ter uma lógica mais simples. Alguém saberia me dar uma dica?
Muito obrigada!
Michelle
_______________________________________________ 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://recologia.com.br/ <http://augustoribas.heliohost.org> Github: https://github.com/Squiercg Lattes: http://lattes.cnpq.br/7355685961127056

Olá Augusto, me desculpa pela demora em responder mas eu estava testando se eu havia entendido! E deu certo! Muito obrigada pelas dicas!!! Em 10 de novembro de 2015 11:08, Augusto Ribas <ribas.aca@gmail.com> escreveu:
Ola.
Talvez se você informar como está lendo seu dados ajude, imagino que está tudo como charater, mas você pode passar esses dados para algum formato de tempo, por exemplo o posix do R, mas tem pacotes so com coisas de tempo também que podem te dar soluções até mais faceis. Mas segue uma solução que talvez ajude.
#veja como é o tempo no R Sys.time()
#criando seu vetor de indices #de um ?as.POSIXct, veja uns exemplos, para converter suas colunas para tempo no formato do posix #Dai vc precisa de um tempo inicial, vamos supor agora inicio <- as.POSIXct("2015-11-10 09:31:18 AMST") #O fim das suas coletas, daqui 30 min por exeplo fim <- inicio + as.difftime(30, units="mins") #e vc cria um vetor de min em min, mas poderia ser qq intervalo, de 5 em 5 min, so mudar o by indice<-seq(from=inicio, by=as.difftime(1, units="mins"), to=fim)
#gerando alguns dados de exemplo medida<-rnorm(100,10,2) horario<-indice[sample(1:length(indice),100,replace=T)] dados<-data.frame(medida,horario)
#veja os dados, imagino que no final vc vai ter medidas e o tempo dados
#agora da pra usar cut com o indice para juntar seus dados e aggregate da forma convencional aggregate(dados$medida,list(cut(dados$horario,indice[-1])),mean) #ai pra normalizar, fazer outras operações, é so ir usando o fator que o cut gera pra vc
Em 10 de novembro de 2015 09:14, Michelle Bau Graczyk <mbgraczyk@gmail.com
escreveu:
Caros, bom dia,
Eu estou com um data frame da forma : "data" "hora" "bid" "bidQ" "ask" "askQ" "last" "volume" "1" 2004-01-04 "09:30" -1 -1 -1 -1 38 55900 "2" 2004-01-04 "09:30" -1 -1 -1 -1 38 600 "3" 2004-01-04 "09:31" -1 -1 -1 -1 38 5000 "4" 2004-01-04 "09:31" 38.05 32 38.08 1 38.05 6000 "5" 2004-01-04 "09:31" 38.06 2 38.08 1 38.06 1500 "6" 2004-01-04 "09:31" 38.06 4 38.07 1 38.06 500 "7" 2004-01-04 "09:32" 38.04 1 38.07 1 38.05 4500 "8" 2004-01-04 "09:32" 38 1 38.2 1 38.03 1600 "9" 2004-01-04 "09:32" 38 1 38.2 1 38.03 3800 "10" 2004-01-04 "09:32" 38 1 38.04 1 38.04 500 "11" 2004-01-04 "09:32" 38 1 38.07 1 38.03 200 "12" 2004-01-04 "09:32" 38 1 38.08 2 38.07 100 "13" 2004-01-04 "09:32" 38 1 38.08 2 38.01 5000 "14" 2004-01-04 "09:32" 38 21 38.08 2 38.05 200 "15" 2004-01-04 "09:33" 38.03 9 38.13 8 38.08 700 "16" 2004-01-04 "09:33" 38.08 15 38.13 8 38.08 100 "17" 2004-01-04 "09:33" 38.11 16 38.13 10 38.12 900
onde as datas vão de 2004-01-04 até 2013-06-30 e os horários de 09:30 até 16:10. Eu tenho que achar o volume médio para cada minuto e depois normalizar esses volumes para cada minuto pelo volume médio. Eu tento montar um programa cheio de for() para data e for() para horário mas não está dando certo… Acho que deve ter uma lógica mais simples. Alguém saberia me dar uma dica?
Muito obrigada!
Michelle
_______________________________________________ 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://recologia.com.br/ <http://augustoribas.heliohost.org> Github: https://github.com/Squiercg 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
-
Michelle Bau Graczyk