[R-br] Numero de dias acima de um valor

Jefferson Ferreira-Ferreira jecogeo em gmail.com
Terça Dezembro 2 15:58:14 BRST 2014


Pessoal, muito obrigado pelas dicas. Eu achei que o rle() seria realmente a
solução.

Mas existe um problema: eu vou precisar dessa informação (o dia em que
começa a enchente) dentro da dataframe oroginal para poder prosseguir nas
análises. Como o rle me retorna um objeto da classe rle de menor length,
não tenho como juntá-la na dataframe (ou ao menos não pude pensar em
nenhuma solução).

a solução que encontrei foi a seguinte:

for (i in nrow(dadosmax)){
  dadosmax$enchday[i] <- if (sum(dadosmax$above[i:(i+44)]) >= 45) 1 else 0
}

o trecho   dadosmax$enchday[i] <- if (sum(dadosmax$above[i:(i+44)]) >= 45)
1 else 0, funciona perfeitamete. Fiz vários testes atribuindo valores ao i.
No entanto, isto não está funcionando dentro do for. Ele me retorna o
seguinte erro:

Error in if (sum(dadosmax$above[i:(i + 44)]) < 45) 1 else 0 :
  missing value where TRUE/FALSE needed

Estou achando que esse erro decorre do fato de que ao final da data frame,
não há mais 45 linhas a serem somadas. Eu tentei usar o try(if...else,
silent=T), mas isso simplesmente esconde o erro e não faz os calculos...

Enfim, se alguém tiver alguma ideia, agradeço.
Abraços!



Em Mon Dec 01 2014 at 16:15:38, Marcos Silva <marcosfs2006 em gmail.com>
escreveu:

A função rle() é a função que faltava... e eu tentando reinventar a roda...
> :)
>
> Abs.
>
>
>
> Em 1 de dezembro de 2014 15:20, Luis G. S. e Silva <
> lgsilvaesilva em gmail.com> escreveu:
>
> Jefferson,
>>
>> A função movsum é uma soma móvel, com janela de tamanho 45. Segue um
>> pequeno exemplo dela:
>>
>> movsum(rep(1, 20), 5)
>> [1] NA NA NA NA  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5
>>
>> Caso fosse uma média móvel o resultado seria 1 ao invés de 5.
>>
>> filter(1:9, rep(1, 3), sides = 1)
>> [1] NA NA  6  9 12 15 18 21 24
>>
>> Note que estamos fazendo uma soma acumulada em janelas de tamanho 3. Como
>> as duas primeiras posições não formam uma janela de tamanho 3 é atribuído
>> NA para elas.
>>
>> 1+2+3 = 6
>> 2+3+4 = 9
>> ...
>>
>> Na minha resposta anteriormente eu esqueci de modificar a função, ele
>> deveria ser definida com n=45
>>
>> movsum <- function(x,n=45){filter(x,rep(1,n), sides=1)}
>>
>> Espero ter ajudado.
>>
>> Um abraço
>>
>>
>> Em 1 de dezembro de 2014 14:57, Rodrigo Coster <rcoster em gmail.com>
>> escreveu:
>>
>> Jefferson,
>>>
>>> Talvez a função rle() possa te ajudar a resolver isso. Segue um exemplo:
>>>
>>> set.seed(12345)
>>> dados <- cumsum(rnorm(10000, 0, 10))
>>>
>>> analise <- rle(dados > 100)
>>> inicio <- cumsum(analise$length) - analise$length + 1
>>>
>>> resultado <- data.frame(inicio = inicio, valor = analise$values,
>>> seguidos = analise$length)
>>> subset(resultado, valor == TRUE & seguidos > 45)
>>>
>>>
>>> 2014-12-01 14:33 GMT-02:00 Jefferson Ferreira-Ferreira <
>>> jecogeo em gmail.com>:
>>>
>>> Marcos e Luis, muito obrigado pelas respostas.
>>>>
>>>> No entanto, Luis, fiquei com uma dúvida na tua solução. Se puderes me
>>>> ajudar te agradeço.
>>>>
>>>> A função que sugerisse movsum <- function(x,n=5){filter(x,rep(1,n),
>>>> sides=1)}, se entendi bem, é uma média móvel, certo? Estou com um pouco de
>>>> dificuldades de entender o que essa função faz. Tu Poderias me explicar
>>>> cada elemento dessa função, por favor?
>>>>
>>>> Caso ela seja uma média móvel, eu de fato, não sei se seria a saída.
>>>>
>>>> Vou colocar em termos simples meu objetivo.
>>>>
>>>> inicio.enchente <- min(dados$diajuliano[which(dados$Nivel > 2 *por 45
>>>> dias consecutivos* )])
>>>>
>>>> Ou seja, o que determinara o dia juliano em que começa minhe enchente é
>>>> um nível d'água maior que 2cm por 45 dias consecutivos. E é justamente
>>>> nesse trecho em negrito que estou me debatendo. Sinceramente, acho que a
>>>> saída não seria uma média móvel.
>>>>
>>>> O que acham??
>>>>
>>>> Abraços!
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> Em Mon Dec 01 2014 at 10:16:04, Luis G. S. e Silva <
>>>> lgsilvaesilva em gmail.com> escreveu:
>>>>
>>>> require(dplyr)
>>>>> movsum <- function(x,n=5){filter(x,rep(1,n), sides=1)}
>>>>>
>>>>> dados <- read.csv2('dado.csv')
>>>>> dados$Nivel <- as.numeric(as.character(xx$Nivel))
>>>>>
>>>>> dadosNovo <- tbl_df(dados) %>%
>>>>>   group_by(Date) %>%
>>>>>   summarise(NivelMax = max(Nivel, na.rm=TRUE)) %>%
>>>>>   mutate(Ind = as.numeric(NivelMax > 2)) %>%
>>>>>   arrange(as.Date(Date, "%d/%m/%Y")) %>%
>>>>>   mutate(DiasEnchente = movsum(Ind))
>>>>>
>>>>> Em 30 de novembro de 2014 13:10, Marcos Silva <marcosfs2006 em gmail.com>
>>>>> escreveu:
>>>>>
>>>>> Ainda não achei uma solução. Mas, caso eu tenha entendido o problema
>>>>>> corretamente, cheguei até aqui:
>>>>>>
>>>>>> library(dplyr)
>>>>>> setwd("E:\\")
>>>>>> dados <- read.csv2("dado.csv")
>>>>>> dados$Nivel <- as.numeric(as.character(dados$Nivel))
>>>>>>
>>>>>> dadosNovo <- tbl_df(dados) %>%
>>>>>>                 group_by(Date) %>%
>>>>>>                 summarise(NivelMax = max(Nivel, na.rm=TRUE)) %>%
>>>>>>                 mutate(Ind = ifelse(NivelMax > 2, 1, 0)) %>%
>>>>>>                 arrange(as.Date(Date, "%d/%m/%Y"))
>>>>>>
>>>>>> > head(dadosNovo, 3)
>>>>>> Source: local data frame [3 x 3]
>>>>>>
>>>>>>         Date NivelMax Ind
>>>>>> 1 01/02/2014     1.04   0
>>>>>> 2 02/02/2014     1.04   0
>>>>>> 3 03/02/2014     1.04   0
>>>>>>
>>>>>> A estratégia até até aqui foi: construir um novo data frame com o
>>>>>> nível máximo em cada dia. Criar uma nova coluna com uma variável indicadora
>>>>>> que recebe o valor 1 se o nível no dia é maior que 2.Fiz isso imaginando
>>>>>> que poderia ser tranquilo contar as sequencias de 1, mas isso se mostrou
>>>>>> não trivial. Bem, pelo menos eu não consegui ainda vislumbrar uma forma de
>>>>>> fazer isso.
>>>>>>
>>>>>> Bem, pode ser que alguem tenha uma forma de fazer isso... e
>>>>>> identificar os ínícios das enchentes...
>>>>>>
>>>>>> Caso eu consiga avançar, volto aqui.
>>>>>>
>>>>>> Abs.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Em 28 de novembro de 2014 17:45, Jefferson Ferreira-Ferreira <
>>>>>> jecogeo em gmail.com> escreveu:
>>>>>>
>>>>>>> Olá amigos!!
>>>>>>>
>>>>>>> Estou com uma questão que não estou sabendo como resolver. Eu tenho
>>>>>>> uma série de dados de nivel d'água (3 vezes por dia). O que eu quero saber
>>>>>>> é em qual data começa a enchente. Como o nível sofre algumas "pequenas
>>>>>>> enchentes" que de fato não representam o real início da enchente, o que eu
>>>>>>> preciso é saber em qual data começa o seguinte evento: nível > 2cm por 45
>>>>>>> dias consecutivos. Isso porque se o nível permanecer por menos de 45 dias
>>>>>>> consecutivos acima de 2cm eu não estou considerando isso como o início da
>>>>>>> enchente, mas como uma subida intermitente da água. Outro complicador é que
>>>>>>> preciso saber essa informação para cada um dos 10 equipamento (datalogger),
>>>>>>> discriminado na culona que chamei de logger. Ou seja, a data (em dia
>>>>>>> juliano) do início da enchente para cada logger.
>>>>>>>
>>>>>>> Em anexo envio os dados de apenas um dos meus aparelhos (logger == 1)
>>>>>>>
>>>>>>> Alguma ideia?
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> R-br mailing list
>>>>>>> R-br em 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.
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Marcos F. Silva
>>>>>> http://sites.google.com/site/marcosfs2006
>>>>>>
>>>>>> _______________________________________________
>>>>>> R-br mailing list
>>>>>> R-br em 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.
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Luís Gustavo Silva e Silva
>>>>>  _______________________________________________
>>>>> R-br mailing list
>>>>> R-br em 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 em 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 em 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.
>>>
>>
>>
>>
>> --
>> Luís Gustavo Silva e Silva
>>
>> _______________________________________________
>> R-br mailing list
>> R-br em 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.
>>
>
>
>
> --
> Marcos F. Silva
> http://sites.google.com/site/marcosfs2006
>  _______________________________________________
> R-br mailing list
> R-br em 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.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20141202/f83ca40a/attachment.html>


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