2

我试图找到一种更快的方法来运行一个函数,它正在寻找一个时间段内每一天的中值。有没有比在 for 循环中运行 Sapply 更快的方法?

for(z in unique(as.factor(df$group))){
all[[z]]<- sapply(period, function(x) median(df[x == df$date & df$group==z, 'y']))
}

样本数据:

date<-as.Date("2011-11-01") + 
runif( 1000, 
       max=as.integer( 
           as.Date( "2012-12-31") - 
               as.Date( "2011-11-01")))
period<-as.Date(min(df$date):max(df$date), origin = "1970-01-01")
df <- data.frame(date=date, y = rnorm(1000), group=factor(rep(letters[1:4], each=250)))
4

2 回答 2

4

如果我理解正确,您想要split by group然后计算median每个date. 这是一个data.table解决方案。

编辑:问题date出在数据集的格式上。它似乎报告了错误的唯一元素数量。所以,我不得不将它重铸为POSIXct格式。

df$date <- as.POSIXct(as.character(df$date), format="%Y-%m-%d")
require(data.table)
dt <- data.table(df)

setkey(dt, "date")
dt.out <- dt[, lapply(letters[1:4], 
          function(x) median(y[group == x])), by = date]

这与 Victor 的输出相同。

于 2013-01-29T00:40:15.563 回答
2

这是使用基本 R 函数的解决方案tapply

tapply(df$y, df$date, median)

更新。从您上面的评论来看,每个组需要一列吗?这也是一个单行:

tapply(df$y, list(df$date, df$group), median)
于 2013-01-29T01:25:43.997 回答