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

Rodrigo Coster rcoster em gmail.com
Terça Dezembro 2 16:08:49 BRST 2014


Jefferson,

Da para fazer usando o resultado do rle(). Segue um exemplo:

set.seed(12345)
dados <- cumsum(rnorm(1000, 0, 10))
dados[380] <- 399 # Só para ter um menor que 400 no meio de 2 maiores

analise <- rle(dados > 400)
inicio <- cumsum(analise$length) - analise$length + 1

resultado <- data.frame(inicio = inicio, valor = analise$values, seguidos =
analise$length)
cheias <- subset(resultado, valor == TRUE & seguidos > 45)
dados_categoria <- rep('Não cheia', 1000)
for (i in 1:nrow(cheias)) {
n <- cheias[i,3]
dados_categoria[0:(n-1) + cheias[i,1]] <- rep('Cheias', n)
}
data.frame(dados, dados_categoria) # Dados originais e categorizados.


2014-12-02 15:58 GMT-02:00 Jefferson Ferreira-Ferreira <jecogeo em gmail.com>:

>
> 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.
>
>
> _______________________________________________
> 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/1a92db2c/attachment.html>


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