[R-br] loop lento

Daniel Batista Lemes dlemes em gmail.com
Domingo Março 15 21:28:50 BRT 2015


Roney,

Não sei teu conhecimento de programação(não uso R, mas sou programador) o
que tu está fazendo é 3 loop, onde, me parece, que tu percorre toda a
matriz todas as vezes, uma forma de otimizar o que tu está fazendo é não
fazer aquele sort ali, tu pode organizar os dados forra do loop, porque
aquilo diminui muito a performance.
Não consegui ver o código, mas quem sabe tu posta ele aqui
http://pastebin.com/ assim como código fica melhor de analisar.
Me parece que tu esta usando esse código apenas para organizar os dados, se
for isso, existe linguagens para eficientes para fazer isso(python é um
exemplo) e ai tu usa o R só para fazer as análises estatísticas.
Caso tu não conheça python e queira manter o R existem implementações com
melhor performance como o pqR(http://www.pqr-project.org/) ou o fastr  (
https://github.com/allr/fastr)

Sei que não te ajudei muito, mas espero ter te dado um norte :D

Daniel Lemes


Em 15 de março de 2015 16:25, Roney Fraga Souza <roneyfraga em gmail.com>
escreveu:

> 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
>
> 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
>
> _______________________________________________
> R-br mailing list
> R-br em 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.
>



-- 


@lemes_daniel
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20150315/301f5b32/attachment.html>


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