
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-inspire... 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-an... 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