[R-br] Exclusão de casos por critério temporal
Paulo Dick
paulopcdick em gmail.com
Sábado Julho 30 17:13:37 BRT 2016
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.
>>
>
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20160730/5a2af427/attachment.html>
Mais detalhes sobre a lista de discussão R-br