[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