
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

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@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@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

Olá Daniel, obrigado pela ajuda! Sou economista sem estudo formal de algoritmo, daí a chance de fazer cagada é grande. Segue link do código: https://gist.github.com/roneyfraga/debb242d919d9fdb3412 <https://gist.github.com/roneyfraga/debb242d919d9fdb3412> Quanto ao sort(), eu preciso fazer ele dentro do primeiro loop, pois e feito um para cada ano e/ou data.frame(). Conversando no IRC freenode #R recomendaram eu substituir a ‘append’ pelo ‘outer’, sendo a segunda uma função mais rápida. Vou tentar ir nesse caminho no primeiro momento, caso não tenho sucesso estou pensando em me aventurar na mundo de Julia. Abraço Roney

Bom a primeira coisa que eu faria era gerar um data.frame com os dados organizados, ai tu teria um loop separado para organizar os dados e depois poderia usar os outros, já te daria uma certa performance Em 15 de março de 2015 22:09, Roney Fraga Souza <roneyfraga@gmail.com> escreveu:
Olá Daniel, obrigado pela ajuda!
Sou economista sem estudo formal de algoritmo, daí a chance de fazer cagada é grande. Segue link do código: https://gist.github.com/roneyfraga/debb242d919d9fdb3412
Quanto ao sort(), eu preciso fazer ele dentro do primeiro loop, pois e feito um para cada ano e/ou data.frame().
Conversando no IRC freenode #R recomendaram eu substituir a ‘append’ pelo ‘outer’, sendo a segunda uma função mais rápida. Vou tentar ir nesse caminho no primeiro momento, caso não tenho sucesso estou pensando em me aventurar na mundo de Julia.
Abraço Roney
_______________________________________________ R-br mailing list R-br@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

Não sei se é exatamente isso o que vc quer, mas é mais rápido :) library(dplyr) grupo <- lapply(2:length(ver2), function(tempo) { x <- ver2[[(tempo-1)]] y <- ver2[[tempo]] z <- x %>% full_join(y, 'name') %>% mutate(label = paste(grupo.x, grupo.y, sep = '-'), tm1.ano = as.numeric(max(PY.y, na.rm = T) - 1), t.ano = as.numeric(max(PY.y, na.rm = T))) z %>% group_by(label, tm1.ano, t.ano) %>% summarize(qtde = n(), tm1.grupo = as.numeric(gsub('-.*', '', label[1])), t.grupo = as.numeric(gsub('^.-', '', label[1]))) %>% ungroup() %>% arrange(tm1.grupo, t.grupo) %>% select(label, qtde, tm1.grupo, tm1.ano, t.grupo, t.ano) %>% na.omit}) Att.,Rubem De: Roney Fraga Souza <roneyfraga@gmail.com> Para: R-br <r-br@listas.c3sl.ufpr.br> Enviadas: Domingo, 15 de Março de 2015 16:25 Assunto: [R-br] loop lento 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@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.

Rubem, é exatamente isso que eu precisava, e é rápido! Seu código chega a ser 8 mil vezes mais rápido que o meu. Para ficar melhor só faltou você me ajudar a escrever minha tese. ;) Muito obrigado! Roney

Roney, boa noite! Já vi que o colega Rubem resolveu a questão. Tinha trabalhado noutra ideia, que deixo para consulta. Não é tão eficiente quanto a solução que vocês tiveram, mas é bem melhor que o código anterior. # <code r> setwd("C:/LAB/Temp/Roney"); getwd() # download.file("https://db.tt/13dT9XQI", destfile="ver2.rds", mode="wb") ver2 <- readRDS("ver2.rds") str(ver2, max=1) to <- Sys.time() RES <- NULL for(k in 2:length(ver2)){ df <- merge(ver2[[k-1]], ver2[[k]], by="name", all=T) df <- df[order(df$grupo.x, df$grupo.y),] tmp <- merge(aggregate(data=df, name~grupo.x+grupo.y, FUN="length"), aggregate(data=df, PY.x~grupo.x+grupo.y, FUN="max")) res <- data.frame(ID=k-1, G1=tmp[,1], G2=tmp[,2], n=tmp[,3], anobase=tmp[,4]) RES <- rbind(RES, res[order(res$G1, res$G2),]) } Sys.time()-to head(RES) # </code> Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]
participantes (4)
-
Daniel Batista Lemes
-
Roney Fraga Souza
-
Rubem Kaipper Ceratti
-
Éder Comunello