[R-br] Exclusão de casos por critério temporal

Henrique Dallazuanna wwwhsd em gmail.com
Domingo Julho 31 21:59:51 BRT 2016


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 em 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 temporarios
> individuos <- as.character(unique(teste$identificador))
>
> # Cria objeto que recebera a base de temporarios apos limpeza
> teste_limpo <- data.frame(matrix(NA, 0, ncol(teste)))
> names(teste_limpo) <- names(teste)
>
> # Loop
> for (contador in individuos) {
>
>   # Separa os registros para cada individuo
>   teste_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 ordenada
>   i = 1
>
>   repeat {
>
>     # Descarta os casos em que a diferenca de tempo e menor que 3 meses
> com relacao a base
>     aux <- subset(teste_individual,
>                   !(0 < teste_individual$mes-teste_individual$mes[i] &
>                       teste_individual$mes-teste_individual$mes[i] < 3))
>
>     # Atualiza os registros do individuo
>     teste_individual <- aux
>
>     # Atualiza contador para voltar e pegar o proximo registro do mesmo
> individuo
>     i <- i+1
>
>     # Quando percorrer todos os registros (do individuo) remanescentes
> apos cada etapa da limpeza, sai do repeat
>     if (i >= nrow(aux)) break
>   }
>
>   # Apos percorrer todos os registros do individuo e executar a limpeza,
> agrega a base que sera a final
>   teste_limpo <- rbind(teste_limpo, teste_individual)
>
> }
>
>
>
> *Paulo Dick*
> Estatístico / Epidemiologia em Saúde Pública
> Tel.: (55 21) 99591-2716
>
> Em 29 de julho de 2016 10:20, Éder Comunello <comunello.eder em 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:00
>>
>>
>>
>>
>> Em 27 de julho de 2016 09:07, Paulo Dick via R-br <
>> r-br em 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ços
>>>
>>> *Paulo Dick*
>>> Estatístico / Epidemiologia em Saúde Pública
>>> Tel.: (55 21) 99591-2716
>>>
>>> _______________________________________________
>>> 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.
>



-- 
Henrique Dallazuanna
Curitiba-Paraná-Brasil
25° 25' 40" S 49° 16' 22" O
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20160731/7e49b618/attachment.html>


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