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