<html><body><div style="color:#000; background-color:#fff; font-family:Courier New, courier, monaco, monospace, sans-serif;font-size:13px"><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr"><span id="yui_3_16_0_1_1426505966956_35726">Não sei se é exatamente isso o que vc quer, mas é mais rápido :)</span></div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr"><span><br></span></div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr"><span><br></span></div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr"><span id="yui_3_16_0_1_1426505966956_35801">library(dplyr)</span></div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr"><span><br></span></div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">grupo <- lapply(2:length(ver2), function(tempo) {</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">  x <- ver2[[(tempo-1)]]</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">  y <- ver2[[tempo]]</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">  </div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">  z <- x %>% </div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">    full_join(y, 'name') %>%</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">    mutate(label = paste(grupo.x, grupo.y, sep = '-'),</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">           tm1.ano = as.numeric(max(PY.y, na.rm = T) - 1),</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">           t.ano = as.numeric(max(PY.y, na.rm = T)))</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">  </div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">  z %>% </div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">    group_by(label, tm1.ano, t.ano) %>%</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">    summarize(qtde = n(),</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">              tm1.grupo = as.numeric(gsub('-.*', '', label[1])),</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">              t.grupo = as.numeric(gsub('^.-', '', label[1]))) %>%</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">    ungroup() %>%</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">    arrange(tm1.grupo, t.grupo) %>%</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">    select(label, qtde, tm1.grupo, tm1.ano, t.grupo, t.ano) %>%</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">    na.omit</div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr"></div><div id="yui_3_16_0_1_1426505966956_35705" dir="ltr" class="" style="">})</div><div class="" style="" id="yui_3_16_0_1_1426505966956_35783"><br class="" style=""></div><div class="" style="" id="yui_3_16_0_1_1426505966956_35783"><br></div><div class="" style="" id="yui_3_16_0_1_1426505966956_35783" dir="ltr">Att.,</div><div class="" style="" id="yui_3_16_0_1_1426505966956_35783" dir="ltr">Rubem</div><br>  <div style="font-family: Courier New, courier, monaco, monospace, sans-serif; font-size: 13px;" id="yui_3_16_0_1_1426505966956_35837"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;" id="yui_3_16_0_1_1426505966956_35836"> <div dir="ltr" id="yui_3_16_0_1_1426505966956_35835"> <hr size="1">  <font size="2" face="Arial"> <b><span style="font-weight:bold;">De:</span></b> Roney Fraga Souza <roneyfraga@gmail.com><br> <b><span style="font-weight: bold;">Para:</span></b> R-br <r-br@listas.c3sl.ufpr.br> <br> <b><span style="font-weight: bold;">Enviadas:</span></b> Domingo, 15 de Março de 2015 16:25<br> <b><span style="font-weight: bold;">Assunto:</span></b> [R-br] loop lento<br> </font> </div> <div class="y_msg_container"><br><div id="yiv0180194291"><div>Olá pessoal, <br class="yiv0180194291"><br class="yiv0180194291">Eu tenho uma lista (ver2) composta por com 14 elementos, cada elemento é um data.frame() contendo as mesmas variáveis, o que varia é apenas a quantidade de linhas. Cada elemento da lista é um ano específico do data.frame(), exemplo, ver2[[1]] é o ano de 1977, ver2[[2]] é 1978, ver2[[3]] é 1979 até o último ano ver2[[14]] que é 1990. Nos data.frame() tenho informações sobre artigos científicos: nome (código que não se repete), grupo (extraído via processo de clusterização), PY (ano que o artigo foi publicado) e one (variável apenas com valor 1 que uso em outros procedimentos). Os data.frame() são cumulativos, no ano de 1978 estão todos os artigos publicados até 1978, em 1979 estão todos os artigos publicados até 1978 mais os artigos publicados em 1979, no em de 1990 estão todos os artigos publicados até 1990. O procedimento de clusterização é realizado de modo independente para cada ano, logo o artigo 'Baker, 1976, V4, P5' pode estar em grupos diferentes para cada ano. <br class="yiv0180194291"><br class="yiv0180194291">Quero saber a origem dos artigos que estão em um determinado grupo. Exemplo, grupo 1 de 1990, é composto por 100 artigos, desses 25 faziam parte do grupo 1 em 1989, 30 do grupo 2 em 1989, 35 do grupo 3 em 1989, e os 10 restantes eu não tenho interesse, pois, foram publicados no ano de 1990 logo não existim nos anos anteriores. Segue exemplo do resultado que eu obtenho o código atual:<br class="yiv0180194291"><br class="yiv0180194291">label qtde tm1.grupo tm1.ano t.grupo t.ano<br class="yiv0180194291">1-2    6         1    1989       2  1990<br class="yiv0180194291">2-1    5         2    1989       1  1990<br class="yiv0180194291">3-1    3         3    1989       1  1990<br class="yiv0180194291">4-5    3         4    1989       5  1990<br class="yiv0180194291">5-4    2         5    1989       4  1990<br class="yiv0180194291">6-9    2         6    1989       9  1990<br class="yiv0180194291">7-6    2         7    1989       6  1990<br class="yiv0180194291">8-8    2         8    1989       8  1990<br class="yiv0180194291">9-10   2         9    1989      10  1990<br class="yiv0180194291"><br class="yiv0180194291">qtde = quantidade de artigos em cada grupo<br class="yiv0180194291">tm1.grupo = ano t menos 1 determinado grupo<br class="yiv0180194291">tm1.ano = ano t menos 1<br class="yiv0180194291">t.grupo = grupo<br class="yiv0180194291">t.ano = ano <br class="yiv0180194291"><br class="yiv0180194291">Para chegar a tal resultado eu utilizo o seguinte código:<br class="yiv0180194291"># ------------------------------<br class="yiv0180194291"># início do código<br class="yiv0180194291"># ------------------------------<br class="yiv0180194291"><br class="yiv0180194291"># baixar o arquivo 'ver2.rds' nesse link:<br class="yiv0180194291"># <a rel="nofollow" target="_blank" class="yiv0180194291 removed-link" href="">https://db.tt/13dT9XQI</a><br class="yiv0180194291"><br class="yiv0180194291">ver2 <- readRDS("~/Downloads/ver2.rds")<br class="yiv0180194291"><br class="yiv0180194291">grupo <- list()<br class="yiv0180194291"><br class="yiv0180194291">for(k in 2:length(ver2)){<br class="yiv0180194291">   grp <- sort(unique((ver2[[k-1]]$grupo))) ### qtde de grupos no ano t-1<br class="yiv0180194291">   grp2 <- sort(unique((ver2[[k]]$grupo))) ### qtde de grupos no ano t<br class="yiv0180194291">   RES <- LAB <- list()<br class="yiv0180194291">   for (i in grp) {<br class="yiv0180194291">       for (j in grp2) {<br class="yiv0180194291">           RES <- append(RES,list(length(intersect(ver2[[k-1]]$name[ver2[[k-1]]$grupo==i], ver2[[k]]$name[ver2[[k]]$grupo==j]))))<br class="yiv0180194291">           LAB <- append(LAB, paste(i,j, sep='-'))<br class="yiv0180194291">       }<br class="yiv0180194291">   }<br class="yiv0180194291">   grupo[[k]] <- data.frame(label=sapply(LAB, "["), qtde=sapply(RES, sum))<br class="yiv0180194291">   grupo[[k]] <- subset(grupo[[k]],qtde>0)<br class="yiv0180194291">   grupo[[k]]$tm1.grupo <- as.numeric(gsub('-.*','',grupo[[k]]$label))<br class="yiv0180194291">   grupo[[k]]$tm1.ano <- as.numeric(max(ver2[[k]]$PY)-1)<br class="yiv0180194291">   grupo[[k]]$t.grupo <- as.numeric(gsub('^.-','',grupo[[k]]$label))<br class="yiv0180194291">   grupo[[k]]$t.ano <- as.numeric(max(ver2[[k]]$PY))<br class="yiv0180194291">}<br class="yiv0180194291"># grupo<br class="yiv0180194291"># ------------------------------<br class="yiv0180194291"># fim do código<br class="yiv0180194291"># ------------------------------<br class="yiv0180194291"><br class="yiv0180194291">Meu problema é: esse código funciona mas é muito lento, muito mesmo, inviabilizando sua aplicação para o volume de dados que trabalho no dia a dia. Alguém conhece uma forma mais rápida de fazer isso.<br class="yiv0180194291"><br class="yiv0180194291">Obs.: parte desse código foi contribuição de Eder Comunello através dessa lista, mas naquela altura o problema estava estruturado de outra forma.<br class="yiv0180194291"><br class="yiv0180194291">Abraço<br class="yiv0180194291">Roney</div></div><br>_______________________________________________<br>R-br mailing list<br><a ymailto="mailto:R-br@listas.c3sl.ufpr.br" class="removed-link" href="">R-br@listas.c3sl.ufpr.br</a><br><a target="_blank" class="removed-link" href="">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>Leia o guia de postagem (<a target="_blank" class="removed-link" href="">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.<br><br></div> </div> </div>  </div></body></html>