[R-br] Dificuldade para manipular interlavo de minutos.

Paulo Justiniano paulojus em leg.ufpr.br
Quarta Junho 15 11:31:19 BRT 2011


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
> 
> 
>


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