Dificuldade para manipular interlavo de minutos.

Ola pessoal, estou aqui tendo problemas para usar horas com o R. Bem basicamente o que eu queria fazer é o seguinte, fiquei observando uns propágulos de macrófitas descendo o rio, ai marcando que horas eu os via. Quando subia algum barquinho eu marcava numa planilha barco subiu, e continuava marcando. Ai ficou uma planilha mais ou menos assim: classe hora s 06:45 s 08:30 s 09:17 b 10:20 b 10:30 b 10:40 b 11:10 b 11:22 b 11:33 onde "s" é sem barco e "b" com barco ai a partir dessa planilha eu queria gerar uma planilha com a diferença de tempo entre cada propágulo, tipo linha 2 - linha 1 por classe; segue um código do que estive fazendo e no final algumas perguntas: ############################################################## # exemplo hora<-c("11:33","9:17","6:45","8:30","10:20","10:30","10:40","11:10","11:22") classe<-c("b",rep("s",3),rep("b",5)) exemplo<-data.frame(cbind(classe,hora)) exemplo #transformando em hora exemplo$hora<-as.POSIXct(strptime(exemplo$hora,format="%H:%M")) exemplo #organizando a planilha por hora exemplo<-exemplo[order(exemplo$hora),] exemplo #o que eu preciso são as diferenças de tempo assim: difftime(exemplo[2,2],exemplo[1,2]) #tentando gerar a planilha que gostaria com um loop de for e um if dif<-NA evento<-NA for (n in 1:(nrow(exemplo)-1)) { if(exemplo$classe[n+1]==exemplo$classe[n]) { dif[n]<-difftime(exemplo[n+1,2],exemplo[n,2]) evento[n]<-exemplo$classe[n] } } final<-data.frame(cbind(evento,dif)) final #########################################################################3 Bem, estou quebrando cabeça aqui, se alguem puder dar uma luz no seguinte: 01 - Porque o difftime se torna um numero quando o loop o coloca dentro do dif? O Dif tem que ser de antemão da classe Date-time? 02 - Porque o evento ali sai numeros e não a classe s ou b? 03 - no meu final, eu nao quero a diferença de tempo da hora que ta trocando de sem barco pra com barco, onde fica NA, como eu faria fazer aquilo nao existir? Tem que colocar algo no else pra não realizar nenhuma operação? 04 - A mensagem truncated se dar por causa do if não calcular a diferença da linha 4 com a 3? Bem é isso, se alguem puder ajudar... -- Grato Augusto C. A. Ribas Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056

Augusto tem umas coisas no seu exemplo que nao entendi: o que acontece (deve ser resitrado) se a condição do if() nao for satisfeita? isto está relacionado com o tamanho do objeto final, se seria nrow(exemplo)-1 ou menos, apenas para o numero de condicoes em que a condicao do if() é satisfeito outros comentarios nos seus pontos abaixo Basicamente: isto pode ser feito sem loop algum: exemplo <- transform(exemplo, dif = c(diff(hora), NA), mesmo = c(diff(as.numeric(exemplo$classe)), NA)) exemplo[!is.na(exemplo$dif) & exemplo$mesmo ==0,c(1,3)] detalhes abaixo On Tue, 14 Jun 2011, Augusto Ribas wrote:
Ola pessoal, estou aqui tendo problemas para usar horas com o R. Bem basicamente o que eu queria fazer é o seguinte, fiquei observando uns propágulos de macrófitas descendo o rio, ai marcando que horas eu os via. Quando subia algum barquinho eu marcava numa planilha barco subiu, e continuava marcando. Ai ficou uma planilha mais ou menos assim: classe hora s 06:45 s 08:30 s 09:17 b 10:20 b 10:30 b 10:40 b 11:10 b 11:22 b 11:33 onde "s" é sem barco e "b" com barco ai a partir dessa planilha eu queria gerar uma planilha com a diferença de tempo entre cada propágulo, tipo linha 2 - linha 1 por classe; segue um código do que estive fazendo e no final algumas perguntas: ############################################################## # exemplo hora<-c("11:33","9:17","6:45","8:30","10:20","10:30","10:40","11:10","11:22") classe<-c("b",rep("s",3),rep("b",5)) exemplo<-data.frame(cbind(classe,hora)) exemplo
#transformando em hora exemplo$hora<-as.POSIXct(strptime(exemplo$hora,format="%H:%M")) exemplo
#organizando a planilha por hora exemplo<-exemplo[order(exemplo$hora),] exemplo #o que eu preciso são as diferenças de tempo assim: difftime(exemplo[2,2],exemplo[1,2]) #tentando gerar a planilha que gostaria com um loop de for e um if dif<-NA evento<-NA for (n in 1:(nrow(exemplo)-1)) { if(exemplo$classe[n+1]==exemplo$classe[n]) { dif[n]<-difftime(exemplo[n+1,2],exemplo[n,2]) evento[n]<-exemplo$classe[n] } } final<-data.frame(cbind(evento,dif)) final #########################################################################3 Bem, estou quebrando cabeça aqui, se alguem puder dar uma luz no seguinte: 01 - Porque o difftime se torna um numero quando o loop o coloca dentro do dif? O Dif tem que ser de antemão da classe Date-time?
O quie vc esperava aqui? é uma diferenca certo? entao deve ser um numero (e nao uma data).
02 - Porque o evento ali sai numeros e não a classe s ou b?
porque exemplo$classe é um fator transformando em catracter vc tem o desejado na saida exemplo$classe <- as.caracter(exemplo$classe)
03 - no meu final, eu nao quero a diferença de tempo da hora que ta trocando de sem barco pra com barco, onde fica NA, como eu faria fazer aquilo nao existir? Tem que colocar algo no else pra não realizar nenhuma operação?
O problema aqui é com o formato do seu for que passa opor todos os valores de n. Isto está relacioando com inha indagacao uinicial. suponha que para n=2 vc tem o if nao atendido e entao dif[2] e evento[2] nao sao preenchidos A seguir se tem algo para n=3 entao para preencher dif[3] ele vai completar dif[2] com NA 2 saidas: - eliminas NA's depoos final <- final[complete.cases(final),] - alterar seu for e/ou a forma como monta o resultado
04 - A mensagem truncated se dar por causa do if não calcular a diferença da linha 4 com a 3?
sim
Bem é isso, se alguem puder ajudar...
-- Grato Augusto C. A. Ribas Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056

01 -o que acontece (deve ser resitrado) se a condição do if() nao for satisfeita? Tirar o NA, tipo um else falando não faça nada, não exista essa linha se a condição do if não for respeitada. Mas acho que retirar o NA depois é mais facil como vc disse no final do e-mail. Completando a minha historinha, sempre há propagulos de macrofitas descendo o rio, dai subia um barquinho e vinham mais propagulos com maior frequencia, depois o barco ia embora e os propagulos voltavam a descer menos frequentemente, então eu pensei em fazer uma média desses intervalos de tempo pra ver se com com barco no rio descem mais propagulos do que sem barco, acho que poderia fazer frequencia de propagulos por minuto também, mas intervalo de tempo me parece mais interessante. ai tenho observações em varios dias, onde um dia é assim: classe hora dia 1 b 11:33 1 2 s 9:17 1 3 s 6:45 1 4 s 8:30 1 5 b 10:20 1 6 b 10:30 1 7 b 10:40 1 8 b 11:10 1 9 b 11:22 1 10 s 11:50 1 11 s 12:34 1 12 s 13:22 1 13 s 13:56 1 Sendo "s" para sem barco e "b" para com barco. Então a partir dessa planilha, eu queria saber a media de intervalos de tempo entre propagulos de macrofita quanto nao tem barco no rio e quanto tem barco no rio pro dia 1 Aqui segue como eu fiz depois de ler seu e-mail: ################################################################ #exemplo hora<-c("11:33","9:17","6:45","8:30","10:20","10:30","10:40","11:10", "11:22","11:50","12:34","13:22","13:56") classe<-c("b",rep("s",3),rep("b",5),rep("s",4)) dia<-rep(1,13) exemplo<-data.frame(cbind(classe,hora,dia)) exemplo #transformando a coluna hora em tempo exemplo$hora<-as.POSIXct(strptime(exemplo$hora,format="%H:%M")) exemplo #organizando a planilha por tempo exemplo<-exemplo[order(exemplo$hora),] exemplo #o que eu preciso são as diferenças de tempo assim em minutos: as.numeric(difftime(exemplo[2,2],exemplo[1,2],units ="mins")) #tentando gerar a planilha que gostaria com um loop de for e um if dif<-NA evento<-NA for (n in 1:(nrow(exemplo)-1)) { if(exemplo$classe[n+1]==exemplo$classe[n]) { dif[n]<-as.numeric(difftime(exemplo[n+1,2],exemplo[n,2],units ="mins")) evento[n]<-as.character(exemplo$classe[n]) } } final<-data.frame(cbind(evento,dif)) final<-final[complete.cases(final),] tapply((as.numeric(levels(final$dif))[final$dif]),final$evento,mean) ############################################################################### Então, basicamente é isso que eu queria, eu li no R book(Crawley 2007) como tranformar um objeto na classe de data_time, mas achei bem pouco intuitivo, eu chutaria um "as.Date-Time" mas nunca pensaria num "as.POSIXct" pra esse tipo de transformação. Mas ainda no exemplo dele: class(as.numeric(difftime("2005-10-21 13:40","2005-10-21 13:20",units="mins"))) O resultado saem numerico, e as minhas diferenças saem como fator, essa parte eu ainda não entendo apesar de aparentemente ter funcionado (cheguei no output que queria). E realmente com o comando tranform fica bem mais economico e bonito fazer a mesma coisa, mas eu não compreendi o que vc fez direito, pra mim ter o mesmo resultado eu teria que colocar um difftime dentro daquele diff que vc usou? Obrigado pela ajuda e paciencia Paulo Justiniano. -- Grato Augusto C. A. Ribas Site Pessoal: http://augustoribas.heliohost.org Lattes: http://lattes.cnpq.br/7355685961127056
participantes (2)
-
Augusto Ribas
-
Paulo Justiniano