Paulo,Outra opção seria:teste[unlist(sapply(split(teste, teste$identificador), function(x)c(TRUE, unlist(diff(x$mes) >= 3)))),]Att--2016-07-30 17:13 GMT-03:00 Paulo Dick via R-br <r-br@listas.c3sl.ufpr.br>:Olá Eder,Agradeço a resposta. Essa estrutura não me atende por completo, pois se eu tiver registros nos meses 3 e 4 ele mantém os dois, já que estão em trimestres diferentes, mesmo com um mês de diferença.Acabei conseguindo montar um monstro aqui, dois loops varrendo os registros um a um, mas que serviu ao que eu precisava:teste <-structure(list(identificador = structure(c(1L, 1L, 2L, 2L, 3L,3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 8L, 9L, 9L, 10L,10L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9","10"), class = "factor"), ano = c(2016L, 2016L, 2016L, 2016L,2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L,2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L), mes = c(5L,6L, 2L, 7L, 3L, 7L, 2L, 6L, 2L, 5L, 5L, 6L, 6L, 7L, 1L, 3L, 6L,3L, 6L, 2L, 7L)), .Names = c("identificador", "ano", "mes"), row.names = c(NA,21L), class = "data.frame")### LIMPEZA #### Separa vetor com os nomes dos individuos onde ha duplicata no registro de temporariosindividuos <- as.character(unique(teste$identificador))# Cria objeto que recebera a base de temporarios apos limpezateste_limpo <- data.frame(matrix(NA, 0, ncol(teste)))names(teste_limpo) <- names(teste)# Loopfor (contador in individuos) {# Separa os registros para cada individuoteste_individual <- subset(teste, identificador == contador)# Loop para cada registro no individuo - comeca no primeiro registro, que sera o mais antigo dado que a base esta ordenadai = 1repeat {# Descarta os casos em que a diferenca de tempo e menor que 3 meses com relacao a baseaux <- subset(teste_individual,!(0 < teste_individual$mes-teste_individual$mes[i] &teste_individual$mes-teste_individual$mes[i] < 3))# Atualiza os registros do individuoteste_individual <- aux# Atualiza contador para voltar e pegar o proximo registro do mesmo individuoi <- i+1# Quando percorrer todos os registros (do individuo) remanescentes apos cada etapa da limpeza, sai do repeatif (i >= nrow(aux)) break}# Apos percorrer todos os registros do individuo e executar a limpeza, agrega a base que sera a finalteste_limpo <- rbind(teste_limpo, teste_individual)}Paulo DickEstatístico / Epidemiologia em Saúde PúblicaTel.: (55 21) 99591-2716Em 29 de julho de 2016 10:20, Éder Comunello <comunello.eder@gmail.com> escreveu:Paulo, bom dia!
# Uma alternativa é identificar o trimestre de cada observação...
dat <- data.frame(id=rep(1:4, 6:3), ano=2016, mes=c(1,2,3,5,6,10,3,7,8,11,12,2,5,9,12,1,3,4))
dat$tri <- ceiling(dat$mes/4)+1
# E preservar somente a mais antiga dentro de cada trimestre...
del <- which(duplicated(dat[,c(1,2,4)]))
dat[-del,] # dados que permanecem
dat[del,] # dados retirados
================================================
Éder Comunello
Researcher at Brazilian Agricultural Research Corporation (Embrapa)
DSc in Agricultural Systems Engineering (USP/Esalq)
MSc in Environ. Sciences (UEM), Agronomist (UEM)
---
Embrapa Agropecuária Oeste, Dourados, MS, Brazil |<O>|
================================================
GEO, -22.2752, -54.8182, 408m
UTC-04:00 / DST: UTC-03:00Em 27 de julho de 2016 09:07, Paulo Dick via R-br <r-br@listas.c3sl.ufpr.br> escreveu:_______________________________________________Companheiros, bom dia.Gostaria que me ajudassem na solução do seguinte problema:Tenho uma base que possui mais de um registro por indivíduo, que preciso fazer uma limpeza a partir das variáveis mês e ano. Preciso retirar apenas os registros que possuem intervalo de tempo menor que 3 meses entre eles, priorizando os registros mais antigos. Ou seja, se tenho 4 registros para um mesmo indivíduo, nos meses 1, 3, 5 e 6 (mesmo ano), fico com as linhas dos meses 1 e 5, e excluo a linha dos meses 3 e 6.Segue sintaxe para gerar fragmento extraído desta base:structure(list(identificador = structure(c(1L, 1L, 2L, 2L, 3L,3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 8L, 9L, 9L, 10L,10L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9","10"), class = "factor"), ano = c(2016L, 2016L, 2016L, 2016L,2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L,2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L), mes = c(5L,6L, 2L, 7L, 3L, 7L, 2L, 6L, 2L, 5L, 5L, 6L, 6L, 7L, 1L, 3L, 6L,3L, 6L, 2L, 7L)), .Names = c("identificador", "ano", "mes"), row.names = c(NA,21L), class = "data.frame")Agradeço pela ajuda.AbraçosPaulo DickEstatístico / Epidemiologia em Saúde PúblicaTel.: (55 21) 99591-2716
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.Henrique Dallazuanna
Curitiba-Paraná-Brasil
25° 25' 40" S 49° 16' 22" O