<div dir="ltr">Paulo, <div><br></div><div>Outra opção seria:</div><div><br></div><div>teste[unlist(sapply(split(teste, teste$identificador), function(x)c(TRUE, unlist(diff(x$mes) >= 3)))),]<br></div><div><br></div><div>Att</div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-07-30 17:13 GMT-03:00 Paulo Dick via R-br <span dir="ltr"><<a href="mailto:r-br@listas.c3sl.ufpr.br" target="_blank">r-br@listas.c3sl.ufpr.br</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Olá Eder,<div><br></div><div>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.</div><div><br></div><div>Acabei conseguindo montar um monstro aqui, dois loops varrendo os registros um a um, mas que serviu ao que eu precisava:</div><div><br></div><div><div>teste <-</div><span class=""><div>structure(list(identificador = structure(c(1L, 1L, 2L, 2L, 3L, </div><div>  3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 8L, 9L, 9L, 10L, </div><div>  10L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9", </div><div>    "10"), class = "factor"), ano = c(2016L, 2016L, 2016L, 2016L, </div><div>      2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, </div><div>      2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L), mes = c(5L, </div><div>        6L, 2L, 7L, 3L, 7L, 2L, 6L, 2L, 5L, 5L, 6L, 6L, 7L, 1L, 3L, 6L, </div><div>        3L, 6L, 2L, 7L)), .Names = c("identificador", "ano", "mes"), row.names = c(NA, </div><div>          21L), class = "data.frame")</div><div><br></div></span><div>### LIMPEZA ###</div><div><br></div><div># Separa vetor com os nomes dos individuos onde ha duplicata no registro de temporarios</div><div>individuos <- as.character(unique(teste$identificador))</div><div><br></div><div># Cria objeto que recebera a base de temporarios apos limpeza</div><div>teste_limpo <- data.frame(matrix(NA, 0, ncol(teste)))</div><div>names(teste_limpo) <- names(teste)</div><div><br></div><div># Loop</div><div>for (contador in individuos) {</div><div>  </div><div>  # Separa os registros para cada individuo</div><div>  teste_individual <- subset(teste, identificador == contador)</div><div>  </div><div>  # Loop para cada registro no individuo - comeca no primeiro registro, que sera o mais antigo dado que a base esta ordenada</div><div>  i = 1</div><div>  </div><div>  repeat {</div><div>    </div><div>    # Descarta os casos em que a diferenca de tempo e menor que 3 meses com relacao a base</div><div>    aux <- subset(teste_individual,</div><div>                  !(0 < teste_individual$mes-teste_individual$mes[i] &</div><div>                      teste_individual$mes-teste_individual$mes[i] < 3))</div><div>    </div><div>    # Atualiza os registros do individuo</div><div>    teste_individual <- aux</div><div>    </div><div>    # Atualiza contador para voltar e pegar o proximo registro do mesmo individuo</div><div>    i <- i+1</div><div>    </div><div>    # Quando percorrer todos os registros (do individuo) remanescentes apos cada etapa da limpeza, sai do repeat</div><div>    if (i >= nrow(aux)) break</div><div>  }</div><div>  </div><div>  # Apos percorrer todos os registros do individuo e executar a limpeza, agrega a base que sera a final</div><div>  teste_limpo <- rbind(teste_limpo, teste_individual)</div><div>  </div><div>}</div></div><div><br></div></div><div class="gmail_extra"><span class=""><br clear="all"><div><div data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><b><br></b></div><div dir="ltr"><b>Paulo Dick</b><div>Estatístico / <span style="font-size:12.8px">Epidemiologia em Saúde Pública</span></div><div>Tel.: <a href="tel:%2855%2021%29%2099591-2716" value="+5521995912716" target="_blank">(55 21) 99591-2716</a></div></div></div></div></div></div></div></div></div>
<br></span><div><div class="h5"><div class="gmail_quote">Em 29 de julho de 2016 10:20, Éder Comunello <span dir="ltr"><<a href="mailto:comunello.eder@gmail.com" target="_blank">comunello.eder@gmail.com</a>></span> escreveu:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:verdana,sans-serif">Paulo, bom dia!<br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br># Uma alternativa é identificar o trimestre de cada observação...<br><span style="font-family:monospace,monospace">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))<br>dat$tri <- ceiling(dat$mes/4)+1</span><br><br># E preservar somente a mais antiga dentro de cada trimestre...<br><span style="font-family:monospace,monospace">del <- which(duplicated(dat[,c(1,2,4)]))<br>dat[-del,] # dados que permanecem<br>dat[del,]  # dados retirados</span><br></div></div><div class="gmail_extra"><br clear="all"><div><div data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><span><br>================================================<br>Éder Comunello<br>Researcher at Brazilian Agricultural Research Corporation (Embrapa)<br>DSc in Agricultural Systems Engineering (USP/Esalq)<br>MSc in Environ. Sciences (UEM), <span>Agronomist (UEM)</span><br>---<br>Embrapa Agropecuária Oeste, Dourados, MS, Brazil |<O>|<br>================================================<br>GEO, -22.2752, -54.8182, 408m<br>UTC-04:00 / DST: UTC-03:00</span><div><div><div><br></div><div><br></div></div><div style="font-size:small"><br></div></div></div></div></div></div></div></div></div></div></div></div></div>
<br><div class="gmail_quote"><div><div>Em 27 de julho de 2016 09:07, Paulo Dick via R-br <span dir="ltr"><<a href="mailto:r-br@listas.c3sl.ufpr.br" target="_blank">r-br@listas.c3sl.ufpr.br</a>></span> escreveu:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr">Companheiros, bom dia.<div><br></div><div>Gostaria que me ajudassem na solução do seguinte problema:</div><div><br></div><div>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.</div><div><br></div><div>Segue sintaxe para gerar fragmento extraído desta base:<br></div><div><div><font face="monospace, monospace">structure(list(identificador = structure(c(1L, 1L, 2L, 2L, 3L, </font></div><div><font face="monospace, monospace">3L, 4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 8L, 9L, 9L, 10L, </font></div><div><font face="monospace, monospace">10L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9", </font></div><div><font face="monospace, monospace">"10"), class = "factor"), ano = c(2016L, 2016L, 2016L, 2016L, </font></div><div><font face="monospace, monospace">2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, </font></div><div><font face="monospace, monospace">2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L), mes = c(5L, </font></div><div><font face="monospace, monospace">6L, 2L, 7L, 3L, 7L, 2L, 6L, 2L, 5L, 5L, 6L, 6L, 7L, 1L, 3L, 6L, </font></div><div><font face="monospace, monospace">3L, 6L, 2L, 7L)), .Names = c("identificador", "ano", "mes"), row.names = c(NA, </font></div><div><font face="monospace, monospace">21L), class = "data.frame")</font></div></div><div><br></div><div>Agradeço pela ajuda.</div><div><br></div><div>Abraços</div><div><div><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><b><br></b></div><div dir="ltr"><b>Paulo Dick</b><div>Estatístico / <span style="font-size:12.8px">Epidemiologia em Saúde Pública</span></div><div>Tel.: <a href="tel:%2855%2021%29%2099591-2716" value="+5521995912716" target="_blank">(55 21) 99591-2716</a></div></div></div></div></div></div></div></div></div>
</div></div>
<br></div></div>_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" rel="noreferrer" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" rel="noreferrer" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.<br></blockquote></div><br></div>
</blockquote></div><br></div></div></div>
<br>_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" rel="noreferrer" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" rel="noreferrer" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Henrique Dallazuanna<br>Curitiba-Paraná-Brasil<br>25° 25' 40" S 49° 16' 22" O</div>
</div>