Exclusão de casos por critério temporal

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

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@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@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.

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@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@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@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.

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 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@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@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@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

Olá Henrique, Obrigado! Parece atender perfeitamente ao que preciso. Vou testar na base completa também e retorno. Abraço *Paulo Dick* Estatístico / Epidemiologia em Saúde Pública Tel.: (55 21) 99591-2716 Em 31 de julho de 2016 21:59, Henrique Dallazuanna <wwwhsd@gmail.com> escreveu:
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 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@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@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@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

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@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@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@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.

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@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@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@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@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.

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@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@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@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@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@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.
participantes (3)
-
Henrique Dallazuanna
-
Paulo Dick
-
Éder Comunello