<html><body><div style="color:#000; background-color:#fff; font-family:arial, helvetica, sans-serif;font-size:10pt"><div><span>Segue uma solução:<br></span></div><div style="color: rgb(0, 0, 0); font-size: 13.33px; font-family: "Arial"; background-color: transparent; font-style: normal"><span><br></span></div><div style="color: rgb(0, 0, 0); font-size: 13.33px; background-color: transparent; font-style: normal; font-family: "Arial""><font face="Courier New, courier, monaco, monospace, sans-serif"><span>library(data.table)<br><br>funID <- function(x) nrow(unique(x))<br><br>dt.dados <- data.table(dados)<br>dt.dados[, list(N = funID(.SD)), by = list(ID, CONTRATO)][N > 1]</span></font><span></span></div><div><span></span></div><div>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.</div><div><br></div><div style="color: rgb(0, 0,
 0); font-size: 13.33px; font-family: "Arial"; background-color: transparent; font-style: normal">att,</div><div style="color: rgb(0, 0, 0); font-size: 13.33px; font-family: "Arial"; background-color: transparent; font-style: normal">Rubem<br> </div><div style="font-size: 10pt; font-family: "arial", "helvetica", sans-serif"> </div>  </div></body></html>