我有一个矩阵mat
,并希望根据分组变量gp
计算列的平均值。
mat<-embed(1:5000,1461)
gp<-c(rep(1:365,each=4),366)
为此,我使用以下
colavg<-t(aggregate(t(mat),list(gp),mean))
但它需要的时间比我预期的要长。
有关使代码运行得更快的任何建议吗?
答案 0 :(得分:2)
这是一个快速算法,我在代码中作了评论。
system.time({
# create a list of column indices per group
gp.list <- split(seq_len(ncol(mat)), gp)
# for each group, compute the row means
means.list <- lapply(gp.list, function(cols)rowMeans(mat[,cols, drop = FALSE]))
# paste everything together
colavg <- do.call(cbind, means.list)
})
# user system elapsed
# 0.08 0.00 0.08
答案 1 :(得分:1)
您可以使用应用功能,例如来自优秀的plyr
包:
# Create data
mat<-embed(1:5000,1461)
gp<-c(rep(1:365,each=4),366)
# Your code
system.time(colavg<-t(aggregate(t(mat),list(gp),mean)))
library(plyr)
# Put all data in a data frame
df <- data.frame(t(mat))
df$gp <- gp
# Using an apply function
system.time(colavg2 <- t(daply(df, .(gp), colMeans)))
输出:
> # Your code
> system.time(colavg<-t(aggregate(t(mat),list(gp),mean)))
user system elapsed
134.21 1.64 139.00
> # Using an apply function
> system.time(colavg2 <- t(daply(df, .(gp), colMeans)))
user system elapsed
52.78 0.06 53.23