采用行意味着基于列的分区

时间:2012-03-31 11:03:43

标签: r matrix

我有一个矩阵mat,并希望根据分组变量gp计算列的平均值。

mat<-embed(1:5000,1461)
gp<-c(rep(1:365,each=4),366)

为此,我使用以下

colavg<-t(aggregate(t(mat),list(gp),mean))

但它需要的时间比我预期的要长。

有关使代码运行得更快的任何建议吗?

2 个答案:

答案 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