在R中获取每月每列最高的5个数值的平均值。

问题描述 投票:1回答:1

我有一个数据框,看起来像这样。

              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个最高值的平均值。

任何帮助将是非常感激的。

r aggregate grouping
1个回答
1
投票

您可以使用 aggregatesort, tailmean 以获得 月度前五名的平均值.

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))
© www.soinside.com 2019 - 2024. All rights reserved.