首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何加快总结和发布的速度?

如何加快总结和发布的速度?
EN

Stack Overflow用户
提问于 2011-03-10 02:57:06
回答 2查看 5.7K关注 0票数 7

我有一个两百万行,15列的数据框。我想用ddply对这些列中的3列进行分组(所有3列都是因子,并且这些因子有780,000个唯一的组合),并获得3列的加权平均值(权重由我的数据集定义)。下面是相当快的:

代码语言:javascript
运行
复制
system.time(a2 <- aggregate(cbind(col1,col2,col3) ~ fac1 + fac2 + fac3, data=aggdf, FUN=mean))
   user  system elapsed 
 91.358   4.747 115.727 

问题是我想使用weighted.mean而不是mean来计算我的聚合列。

如果我在相同的数据帧上尝试以下ddply (注意,我强制转换为不可变),则在20分钟后无法完成以下操作:

代码语言:javascript
运行
复制
x <- ddply(idata.frame(aggdf), 
       c("fac1","fac2","fac3"), 
       summarise, 
       w=sum(w), 
       col1=weighted.mean(col1, w), 
       col2=weighted.mean(col2, w),
       col3=weighted.mean(col3, w))

此操作似乎需要占用大量CPU资源,但对RAM的占用不是很大。

编辑:所以我最终写了这个小函数,它利用了加权均值的一些属性,对整个对象进行了乘除运算,而不是对切片进行乘除。

代码语言:javascript
运行
复制
weighted_mean_cols <- function(df, bycols, aggcols, weightcol) {
    df[,aggcols] <- df[,aggcols]*df[,weightcol]
    df <- aggregate(df[,c(weightcol, aggcols)], by=as.list(df[,bycols]), sum)
    df[,aggcols] <- df[,aggcols]/df[,weightcol]
    df
}

当我以以下身份运行时:

代码语言:javascript
运行
复制
a2 <- weighted_mean_cols(aggdf, c("fac1","fac2","fac3"), c("col1","col2","col3"),"w")

我得到了良好的性能,以及一些可重用的优雅代码。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-10 05:34:52

如果您要使用您的编辑,为什么不使用rowsum并节省几分钟的执行时间呢?

代码语言:javascript
运行
复制
nr <- 2e6
nc <- 3
aggdf <- data.frame(matrix(rnorm(nr*nc),nr,nc),
                    matrix(sample(100,nr*nc,TRUE),nr,nc), rnorm(nr))
colnames(aggdf) <- c("col1","col2","col3","fac1","fac2","fac3","w")

system.time({
aggsums <- rowsum(data.frame(aggdf[,c("col1","col2","col3")]*aggdf$w,w=aggdf$w), 
  interaction(aggdf[,c("fac1","fac2","fac3")]))
agg_wtd_mean <- aggsums[,1:3]/aggsums[,4]
})
#   user  system elapsed 
#  16.21    0.77   16.99 
票数 2
EN

Stack Overflow用户

发布于 2011-03-10 03:28:50

尽管在代码的优雅和易用性方面,ddply是无可匹敌的,但我发现对于大数据,tapply要快得多。在您的示例中,我将使用

代码语言:javascript
运行
复制
do.call("cbind", list((w <- tapply(..)), tapply(..)))

对于问题的点和可能的错误理解,很抱歉;但我有点赶时间,必须在大约负五分钟内赶上一辆公交车!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5250750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档