
Caros, tudo bem? Estou com um código que gostaria de otimizar. Notem que faço um for para fazer tabulações simples. Como posso otimizar este código? Tenho que realizar 3k~4k tabelas... temp <- list() for(i in 1:20){ temp[[i]] <- data.frame(matrix(ncol=3,nrow=100)) colnames(temp[[i]]) <- c('ID','Tipo','Valor') temp[[i]]$ID <- paste(i,sprintf("%03d",1:100),sep='') temp[[i]]$Tipo <- factor(sample(0:10,100,replace=T),levels=c(0:10)) temp[[i]]$Valor <- rnorm(100,100,20) } dado <- data.frame(matrix(ncol=13,nrow=20)) colnames(dado) <- c('ID',paste('Tipo',sprintf('%02d',0:10),sep=''),'TipoNA') for(i in 1:20){ dado[i,] <- c(i,table(temp[[i]]$Tipo,exclude=NULL)) } Pensei algo com do.call ou sapply, mas não sei como definir apenas uma coluna... Abraços, Leandro

A ideia é automatizar só o 2o for() né? Se for: t(sapply(temp,function(x) table(x$Tipo,useNA='always'))) Depois é só acrescentar a 1a coluna com os ids (ou usar rownames pra isso) e arrumar os nomes das colunas. Só acho que vai dar erro se em algum tipo não aparecer em todos cenários On Thu, Jan 17, 2013 at 3:35 PM, Leandro Marino < leandromarino@leandromarino.com.br> wrote:
temp <- list() for(i in 1:20){ temp[[i]] <- data.frame(matrix(ncol=3,nrow=100)) colnames(temp[[i]]) <- c('ID','Tipo','Valor') temp[[i]]$ID <- paste(i,sprintf("%03d",1:100),sep='') temp[[i]]$Tipo <- factor(sample(0:10,100,replace=T),levels=c(0:10)) temp[[i]]$Valor <- rnorm(100,100,20) } dado <- data.frame(matrix(ncol=13,nrow=20)) colnames(dado) <- c('ID',paste('Tipo',sprintf('%02d',0:10),sep=''),'TipoNA') for(i in 1:20){ dado[i,] <- c(i,table(temp[[i]]$Tipo,exclude=NULL)) }

Uma coisa que o Benilton sempre faz quando o for() envolve um número conhecido fixo de elementos é criar o objeto do tamanho de etapas do for() #temp <- list() # troque por temp <- vector(mode="list", lenght=20) #for(i in 1:20){ # troque por D <- data.frame(matrix(ncol=3,nrow=100)) colnames(D) <- c('ID','Tipo','Valor') for(i in 1:length(temp)){ # temp[[i]] <- data.frame(matrix(ncol=3,nrow=100)) # pode ser criada fora do laço, D # colnames(temp[[i]]) <- c('ID','Tipo','Valor') temp[[i]] <- D temp[[i]]$ID <- paste(i,sprintf("%03d",1:100),sep='') temp[[i]]$Tipo <- factor(sample(0:10,100,replace=T),levels=c(0:10)) temp[[i]]$Valor <- rnorm(100,100,20) } dado <- data.frame(matrix(ncol=13,nrow=20)) colnames(dado) <- c('ID',paste('Tipo',sprintf('%02d',0:10),sep=''),'TipoNA') for(i in 1:20){ dado[i,] <- c(i,table(temp[[i]]$Tipo,exclude=NULL)) } Não explorei tudo que pode ser alterado. Ao mesmo tempo você pode fazer isso com a função replicate() também. À disposição. ========================================================================== Walmes Marques Zeviani LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W) Departamento de Estatística - Universidade Federal do Paraná fone: (+55) 41 3361 3573 VoIP: (3361 3600) 1053 1173 e-mail: walmes@ufpr.br skype: walmeszeviani twitter: @walmeszeviani homepage: http://www.leg.ufpr.br/~walmes linux user number: 531218 ==========================================================================

se vc criar o seu 'temp' de forma q ele contenha um indice para o grupo, conforme abaixo (onde eu apenas forco a barra p criar o data.frame do jeito q eu imagino ser melhor, vc pode cria-lo de modo bem mais eficaz dentro do seu primeiro for() ): temp = do.call(rbind, lapply(1:length(temp), function(i) cbind(i, temp[[i]]))) enfim, com o 'tempo' como acima, tudo o que vc precisa e': with(temp, table(i, Tipo)) b On 17 January 2013 17:53, Walmes Zeviani <walmeszeviani@gmail.com> wrote:
Uma coisa que o Benilton sempre faz quando o for() envolve um número conhecido fixo de elementos é criar o objeto do tamanho de etapas do for()
#temp <- list() # troque por temp <- vector(mode="list", lenght=20) #for(i in 1:20){ # troque por D <- data.frame(matrix(ncol=3,nrow=100)) colnames(D) <- c('ID','Tipo','Valor') for(i in 1:length(temp)){ # temp[[i]] <- data.frame(matrix(ncol=3,nrow=100)) # pode ser criada fora do laço, D # colnames(temp[[i]]) <- c('ID','Tipo','Valor') temp[[i]] <- D temp[[i]]$ID <- paste(i,sprintf("%03d",1:100),sep='') temp[[i]]$Tipo <- factor(sample(0:10,100,replace=T),levels=c(0:10)) temp[[i]]$Valor <- rnorm(100,100,20) } dado <- data.frame(matrix(ncol=13,nrow=20)) colnames(dado) <- c('ID',paste('Tipo',sprintf('%02d',0:10),sep=''),'TipoNA') for(i in 1:20){ dado[i,] <- c(i,table(temp[[i]]$Tipo,exclude=NULL)) }
Não explorei tudo que pode ser alterado. Ao mesmo tempo você pode fazer isso com a função replicate() também.
À disposição.
========================================================================== Walmes Marques Zeviani LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W) Departamento de Estatística - Universidade Federal do Paraná fone: (+55) 41 3361 3573 VoIP: (3361 3600) 1053 1173 e-mail: walmes@ufpr.br skype: walmeszeviani twitter: @walmeszeviani homepage: http://www.leg.ufpr.br/~walmes linux user number: 531218 ==========================================================================
_______________________________________________ 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.

Valeu caros! Vou testar todas as sugestões. B, os df's eu já tenho. São umas (muitas) importações! :) Em 17 de janeiro de 2013 16:41, Benilton Carvalho < beniltoncarvalho@gmail.com> escreveu:
se vc criar o seu 'temp' de forma q ele contenha um indice para o grupo, conforme abaixo (onde eu apenas forco a barra p criar o data.frame do jeito q eu imagino ser melhor, vc pode cria-lo de modo bem mais eficaz dentro do seu primeiro for() ):
temp = do.call(rbind, lapply(1:length(temp), function(i) cbind(i, temp[[i]])))
enfim, com o 'tempo' como acima, tudo o que vc precisa e':
with(temp, table(i, Tipo))
b
On 17 January 2013 17:53, Walmes Zeviani <walmeszeviani@gmail.com> wrote:
Uma coisa que o Benilton sempre faz quando o for() envolve um número conhecido fixo de elementos é criar o objeto do tamanho de etapas do for()
#temp <- list() # troque por temp <- vector(mode="list", lenght=20) #for(i in 1:20){ # troque por D <- data.frame(matrix(ncol=3,nrow=100)) colnames(D) <- c('ID','Tipo','Valor') for(i in 1:length(temp)){ # temp[[i]] <- data.frame(matrix(ncol=3,nrow=100)) # pode ser criada fora do laço, D # colnames(temp[[i]]) <- c('ID','Tipo','Valor') temp[[i]] <- D temp[[i]]$ID <- paste(i,sprintf("%03d",1:100),sep='') temp[[i]]$Tipo <- factor(sample(0:10,100,replace=T),levels=c(0:10)) temp[[i]]$Valor <- rnorm(100,100,20) } dado <- data.frame(matrix(ncol=13,nrow=20)) colnames(dado) <- c('ID',paste('Tipo',sprintf('%02d',0:10),sep=''),'TipoNA') for(i in 1:20){ dado[i,] <- c(i,table(temp[[i]]$Tipo,exclude=NULL)) }
Não explorei tudo que pode ser alterado. Ao mesmo tempo você pode fazer isso com a função replicate() também.
À disposição.
==========================================================================
Walmes Marques Zeviani LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W) Departamento de Estatística - Universidade Federal do Paraná fone: (+55) 41 3361 3573 VoIP: (3361 3600) 1053 1173 e-mail: walmes@ufpr.br skype: walmeszeviani twitter: @walmeszeviani homepage: http://www.leg.ufpr.br/~walmes linux user number: 531218
==========================================================================
_______________________________________________ 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.
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.

do.call(rbind, lapply(temp, function(.x) table(.x$Tipo, exclude=NULL))) 2013/1/17 Leandro Marino <leandromarino@leandromarino.com.br>:
Valeu caros! Vou testar todas as sugestões.
B, os df's eu já tenho. São umas (muitas) importações! :)
Em 17 de janeiro de 2013 16:41, Benilton Carvalho <beniltoncarvalho@gmail.com> escreveu:
se vc criar o seu 'temp' de forma q ele contenha um indice para o grupo, conforme abaixo (onde eu apenas forco a barra p criar o data.frame do jeito q eu imagino ser melhor, vc pode cria-lo de modo bem mais eficaz dentro do seu primeiro for() ):
temp = do.call(rbind, lapply(1:length(temp), function(i) cbind(i, temp[[i]])))
enfim, com o 'tempo' como acima, tudo o que vc precisa e':
with(temp, table(i, Tipo))
b
On 17 January 2013 17:53, Walmes Zeviani <walmeszeviani@gmail.com> wrote:
Uma coisa que o Benilton sempre faz quando o for() envolve um número conhecido fixo de elementos é criar o objeto do tamanho de etapas do for()
#temp <- list() # troque por temp <- vector(mode="list", lenght=20) #for(i in 1:20){ # troque por D <- data.frame(matrix(ncol=3,nrow=100)) colnames(D) <- c('ID','Tipo','Valor') for(i in 1:length(temp)){ # temp[[i]] <- data.frame(matrix(ncol=3,nrow=100)) # pode ser criada fora do laço, D # colnames(temp[[i]]) <- c('ID','Tipo','Valor') temp[[i]] <- D temp[[i]]$ID <- paste(i,sprintf("%03d",1:100),sep='') temp[[i]]$Tipo <- factor(sample(0:10,100,replace=T),levels=c(0:10)) temp[[i]]$Valor <- rnorm(100,100,20) } dado <- data.frame(matrix(ncol=13,nrow=20)) colnames(dado) <- c('ID',paste('Tipo',sprintf('%02d',0:10),sep=''),'TipoNA') for(i in 1:20){ dado[i,] <- c(i,table(temp[[i]]$Tipo,exclude=NULL)) }
Não explorei tudo que pode ser alterado. Ao mesmo tempo você pode fazer isso com a função replicate() também.
À disposição.
========================================================================== Walmes Marques Zeviani LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W) Departamento de Estatística - Universidade Federal do Paraná fone: (+55) 41 3361 3573 VoIP: (3361 3600) 1053 1173 e-mail: walmes@ufpr.br skype: walmeszeviani twitter: @walmeszeviani homepage: http://www.leg.ufpr.br/~walmes linux user number: 531218
==========================================================================
_______________________________________________ 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.
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.
_______________________________________________ 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.
participantes (4)
-
Benilton Carvalho
-
Leandro Marino
-
Rodrigo Coster
-
Walmes Zeviani