Olá a todos

Duas coisas sobre tabulação de dados. Considerar ambas pode tornar possível 
executar uma tarefa com um BIG data.frame em R.

1) o pacote dataframe foi criado para melhorar a performance em trabalhar com 
data.frame. O autor desse pacote, Tim Hesterberg, trabalha o Google. Ele 
apresentou seu pacote no useR! 2012 e as idéias de programação utilizadas. 
O r-core member Luke Tierney implementou essas idéias no R base, na versão 
2.15.1 (released a uma semana). Li isso em 
   
http://www.r-bloggers.com/r-2-15-1-includes-performance-improvements-inspired-by-dataframe-package/ 
e sugiro fortemente o upgrade do R para a versão 2.15.1, pois: 
 - Tim Hesterberg created the dataframe package to speed up R for 500+ R users 
at Google, and the talk from his colleague Karl Millar on using Google's 
big-data infrastructure with R. 
 - Tim reported that using the dataframe package with R 2.15.0 improved 
performance by 21% for creation and column subscripting, and by 14% for row 
subscripting.
 - Além dessa sugestão, o Tim Hesterberg fez também sugestão que melhora a 
performance da função tabulate(), usada pela função table(). A sugestão dele é 
usar dup=FALSE no .C() da tabulate(), que as vezes usamos papa chamar nossos 
códigos em C, correndo um certo risco. Esta sugestão evita duplicação de 
memória. Ou seja, a diferença está em conseguir ou não fazer uma tabela com um 
BIG data em R.

Nos dois testes abaixo, fiz com as duas versões do R,
  n <- 1e5; ns=10
  system.time(replicate(ns, data.frame(a=rep(gl(3,5),n))))
  system.time(replicate(ns, table(rep(gl(3,5),n))))

houve redução, da versão 2.15.1 em relação a versão 2.15.0, de 22% no primeiro 
teste e 8% no segundo teste.



2) Ha alguns dias o Walmes mostrou-me um post no r-bloggers mostrando a 
eficiência do pacote data.table 
  http://www.r-bloggers.com/transforming-subsets-of-data-in-r-with-by-ddply-and-data-table/
Foi reportado nesse post que, usando a R 2.15.0, usar o pacote data.table é 95 
vezes mais rápido que usar do.call com by e 120 vezes mais rápido que usar 
ddply (do pacote plyr). 

Testei o seguinte script com R 2.15.0 e R 2.15.1 (similar ao postado no blog)


 require(plyr)
 require(data.table)
 
 set.seed(1)
 df <- data.frame(Company=rep(paste("Company", 1:100),1000),
                  Product=gl(50,200), 
                  Year=sort(rep(2002:2011,10000)), 
                  Sales=rnorm(100000,100,10))

 fn <- function(x) x/sum(x)
 
 r1 <- system.time(
  R1 <- do.call("rbind", as.list(
    by(df, df[c("Company","Year")], 
       transform, Share=fn(Sales))
  ))
 )
 
 r2 <- system.time(
  R2 <- ddply(df, c("Company", "Year"), 
              transform, Share=fn(Sales))
 )

 r3 <- system.time({
  dt <- data.table(df)
  setkey(dt, "Year", "Company")
  X <- dt[, list(SUM=sum(Sales)), by=key(dt)]
  R3 <- dt[X, list(Company, Sales, Product, Share=Sales/SUM)]
 })
 
Como o data.table já era otimizado, não houve redução significativa da versão R 
2.15.0 para a R 2.15.1. Houve redução de 20% usando do.call com by ou usando 
ddply. Ou seja, usar o data.table ainda é muito mais rápido que usar do.call 
com by ou ddply.

Att.
Elias T. Krainski
_______________________________________________
R-br mailing list
[email protected]
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.

Responder a