我试图找到一种更快的方法来运行一个函数,该函数正在寻找一个时间段内每一天的中值。有没有比在 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)))
最佳答案
如果我没理解错的话,您想按组拆分
,然后计算每个日期
内的中位数
。这是一个 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 的输出相同。
关于r - 在 for 循环中运行 sapply 的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14573771/