[R-br] R 2.15.1, eficiência com BIG's data.frame e tabelas
Elias T. Krainski
eliaskrainski em yahoo.com.br
Sexta Junho 29 16:32:22 BRT 2012
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
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20120629/155d13f9/attachment.html>
Mais detalhes sobre a lista de discussão R-br