[R-br] loop lento

Roney Fraga Souza roneyfraga em gmail.com
Domingo Março 15 16:25:03 BRT 2015


Olá pessoal, 

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. 

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:

label qtde tm1.grupo tm1.ano t.grupo t.ano
1-2    6         1    1989       2  1990
2-1    5         2    1989       1  1990
3-1    3         3    1989       1  1990
4-5    3         4    1989       5  1990
5-4    2         5    1989       4  1990
6-9    2         6    1989       9  1990
7-6    2         7    1989       6  1990
8-8    2         8    1989       8  1990
9-10   2         9    1989      10  1990

qtde = quantidade de artigos em cada grupo
tm1.grupo = ano t menos 1 determinado grupo
tm1.ano = ano t menos 1
t.grupo = grupo
t.ano = ano 

Para chegar a tal resultado eu utilizo o seguinte código:
# ------------------------------
# início do código
# ------------------------------

# baixar o arquivo 'ver2.rds' nesse link:
# https://db.tt/13dT9XQI <https://db.tt/13dT9XQI>

ver2 <- readRDS("~/Downloads/ver2.rds")

grupo <- list()

for(k in 2:length(ver2)){
   grp <- sort(unique((ver2[[k-1]]$grupo))) ### qtde de grupos no ano t-1
   grp2 <- sort(unique((ver2[[k]]$grupo))) ### qtde de grupos no ano t
   RES <- LAB <- list()
   for (i in grp) {
       for (j in grp2) {
           RES <- append(RES,list(length(intersect(ver2[[k-1]]$name[ver2[[k-1]]$grupo==i], ver2[[k]]$name[ver2[[k]]$grupo==j]))))
           LAB <- append(LAB, paste(i,j, sep='-'))
       }
   }
   grupo[[k]] <- data.frame(label=sapply(LAB, "["), qtde=sapply(RES, sum))
   grupo[[k]] <- subset(grupo[[k]],qtde>0)
   grupo[[k]]$tm1.grupo <- as.numeric(gsub('-.*','',grupo[[k]]$label))
   grupo[[k]]$tm1.ano <- as.numeric(max(ver2[[k]]$PY)-1)
   grupo[[k]]$t.grupo <- as.numeric(gsub('^.-','',grupo[[k]]$label))
   grupo[[k]]$t.ano <- as.numeric(max(ver2[[k]]$PY))
}
# grupo
# ------------------------------
# fim do código
# ------------------------------

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.

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.

Abraço
Roney
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20150315/a40bddcd/attachment.html>


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