[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