Identificar cadastros com dados diferentes

Caros, venho mais uma vez solicitar a ajuda de vocês. O sistema de onde trabalho me fornece um relatório que tem 13 informações, mas só 4 informações primordiais: ID, Contrato, Info1 e Info2. Os relatórios são mensais e cada ID pode ter mais de um contrato (mas somente um por mês). Estou montando um relatório geral, juntando informações dos últimos 5 anos. Era esperado que, para cada combinação ID-Contrato, Info1 e Info2 fossem iguais em todos os meses, mas não é o que está acontecendo, e preciso identificar os pares ID-Contrato que isso não ocorre, só que não me veio a cabeça nenhuma maneira prática de fazer isso. Por exemplo: (dados <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), CONTRATO = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), INFO1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), INFO2 = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L)), .Names = c("ID", "CONTRATO", "INFO1", "INFO2" ), class = "data.frame", row.names = c(NA, -29L))) Nesse exemplo ele deveria identificar: ID: 1 Contrato: 2 ID: 2 Contrato: 2 ID: 3 Contrato: 1 O banco total (a junção de todos relatórios) possui 200.000 linhas, portanto estou buscando alternativas antes de vasculhar linha por linha num for. Valeu!

Segue uma solução: library(data.table) funID <- function(x) nrow(unique(x)) dt.dados <- data.table(dados) dt.dados[, list(N = funID(.SD)), by = list(ID, CONTRATO)][N > 1] Eu ia dar a sugestão de usar um split + lapply + do.call, mas poderia ser problemático se houvesse um número grande de combinações ID x CONTRATO. att, Rubem

Rubem, deu certo aqui. Obrigado! Só a cargo de curiosidade, outra solução que encontrei: temp <- dados[!duplicated(data.frame(dados$ID,dados$CONTRATO,dados$INFO1,dados$INFO2)),] temp <- temp[duplicated(data.frame(temp$ID,temp$CONTRATO)),] temp <- temp[!duplicated(data.frame(temp$ID,temp$CONTRATO)),] On Fri, Nov 9, 2012 at 10:40 PM, Rubem Kaipper Ceratti < rubem_ceratti@yahoo.com.br> wrote:
Segue uma solução:
library(data.table)
funID <- function(x) nrow(unique(x))
dt.dados <- data.table(dados) dt.dados[, list(N = funID(.SD)), by = list(ID, CONTRATO)][N > 1] Eu ia dar a sugestão de usar um split + lapply + do.call, mas poderia ser problemático se houvesse um número grande de combinações ID x CONTRATO.
att, Rubem
_______________________________________________ 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 (2)
-
Rodrigo Coster
-
Rubem Kaipper Ceratti