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

Paulo Dick paulopcdick em gmail.com
Terça Agosto 23 11:37:49 BRT 2016


Olá a todos,

Apliquei a solução proposta pelo Henrique na base completa e funcionou
perfeitamente. A estrutura que eu tinha montado (com os dois loops) não
tinha funcionado 100%, mas esta sim:

teste[unlist(sapply(split(teste, teste$identificador), function(x)c(TRUE,
unlist(diff(x$mes) >= 3)))),]

Abraços e obrigado novamente.


*Paulo Dick*
Estatístico / Epidemiologia em Saúde Pública
Tel.: (55 21) 99591-2716

Em 1 de agosto de 2016 11:15, Éder Comunello <comunello.eder em gmail.com>
escreveu:

> Paulo, olá novamente!
>
> Fiz um teste, aproveitando a ideia colocada pelo Henrique...
>
> teste <- data.frame(id=rep(1:3, each=10), ano=2016,
> mes=c(1:5,7,9:12,1:3,6:12,1:10))
> teste$tri <- ceiling(teste$mes/3)+1
> del <- which(duplicated(teste[,c(1,2,4)]))
>
> res1 <- teste[-del,]; res1
>
> res2 <- teste[unlist(sapply(split(teste, teste$id), function(x) c(TRUE,
> unlist(diff(x$mes) >= 3)))),]; res2
>
> res3 <- res1[unlist(sapply(split(res1, res1$id), function(x) c(TRUE,
> unlist(diff(x$mes) >= 3)))),]; res3
>
> Mas acredito que ainda não seja o que você pretende. Pelo que entendi a
> saída correta seria tal como colocado abaixo:
>
> # id  ano mes tri
> # 1   1 2016   1   2
> # 4   1 2016   4   3
> # 6   1 2016   7   4
> # 8   1 2016  10   5
> # 11  2 2016   1   2
> # 14  2 2016   6   3
> # 15  2 2016   9   4
> # 18  2 2016  12   5
> # 21  3 2016   1   2
> # 24  3 2016   4   3
> # 27  3 2016   7   4
> # 30  3 2016  10   5
>
>
> ================================================
> É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 1 de agosto de 2016 09:14, Éder Comunello <comunello.eder em gmail.com>
> escreveu:
>
>> Só corrigindo o código que postei... De fato, para o trimestre seria:
>>
>> dat$tri <- ceiling(dat$mes/3)+1
>>
>>
>> ================================================
>> É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 29 de julho de 2016 09: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/20160823/10e00f1c/attachment.html>


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