我有一个数据框,看起来像这样。
ANDRITZ VERBUND STRABAG SE TELEKOM AUSTRIA VOESTALPINE WIENERBERGER
2009-01-29 -0.01191567 0.0252923579 -0.04838710 0.005430566 0.01360294 -0.03309218
2009-01-30 0.02922078 -0.0009725906 -0.01355932 0.037037037 -0.07072905 0.01399473
2009-02-02 -0.02140604 -0.0493849013 -0.04123711 -0.008928571 0.01834504 -0.08239956
2009-02-03 0.07460281 0.0031654408 0.01433692 0.027777778 0.01303181 0.01295607
2009-02-04 0.01221341 0.0216241299 -0.01060071 -0.004382761 0.11464245 0.08027051
2009-02-05 -0.01248942 0.0274345930 -0.02142857 -0.031548056 -0.04175153 -0.04953729
它包含了大约35年的日常数据 我想得到每个月每个列中5个最高值的平均值
到目前为止,我已经尝试了这个方法。
data <- as.data.frame(xts(matrix(runif(108, -1, 1), ncol=6),
order.by = seq.Date(as.Date("2009-01-24"), by = "day", length.out = 18))) #reproducible example
MAX <- apply(data, 2, function(x) order(x, decreasing = T)[1:5])
result <- unlist(lapply(1:NCOL(data), function(x) mean(data[MAX[,x],x])))
这给了我每列5个最高值的平均数,但不是每个月(我意识到这可能不是最有效的方法)。 我试着把它和以下方法结合起来: aggregate
函数,或使用 dplyr
包,但一直无法管理分组以获得每月5个最高值的平均值。
任何帮助将是非常感激的。
您可以使用 aggregate
与 sort
, tail
和 mean
以获得 月度前五名的平均值.
data$date <- format(data$date, "%Y-%m")
aggregate(. ~ date, data, function(x) mean(tail(sort(x), 5)))
# date X1 X2 X3 X4 X5 X6
#1 2009-01 0.4155773 -0.1588251 0.6956570 0.4914652 0.4077123 0.5147612
#2 2009-02 0.5392858 0.4840573 -0.2273043 0.3931874 -0.1614169 0.1222684
如果你想忽略 NA
试。
aggregate(. ~ date, data, function(x) {
x <- x[!is.na(x)]
if(length(x) > 0) {mean(tail(sort(x), 5))} else {NA}
})
数据:
set.seed(42)
data <- data.frame(date=seq.Date(as.Date("2009-01-24"), by = "day", length.out = 18), matrix(runif(108, -1, 1), ncol=6))