Мы могли бы адаптировать функцию для среднего геометрического для наших целей, чтобы получить %
дисплей.
gmMean <- function(x, na.rm=TRUE) {
paste0(sprintf("%.1f", exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))*100), "%")
}
Затем эту функцию можно применить при создании фрейма данных.
res <- data.frame(Year=strftime(dat$Quarter, format="%Y"),
Quarter=factor(substr(dat$Quarter, 6, 7), labels=paste0("Q", 1:4)),
Geom.Mean=apply(dat[-1], 1, gmMean))
res
# Year Quarter Geom.Mean
# 1 2021 Q1 20.7%
# 2 2021 Q2 21.0%
# 3 2021 Q3 0.9%
# 4 2021 Q4 1.9%
# 5 2022 Q1 2.6%
# 6 2022 Q2 3.0%
# 7 2022 Q3 3.4%
# 8 2022 Q4 3.5%
# 9 2023 Q1 3.5%
# 10 2023 Q2 3.4%
# 11 2023 Q3 3.3%
# 12 2023 Q4 3.3%
Чтобы получить среднее геометрическое значение для целых лет, мы можем сначала создать переменную года
dat$year <- strftime(dat$Quarter, format="%Y")
, а затем сделать
res <- aggregate(. ~ year, dat, gmMean)[-2]
res
# year A B
# 1 2021 4.4% 6.3%
# 2 2022 4.7% 2.1%
# 3 2023 5.0% 2.3%
Данные
dat <- structure(list(Quarter = structure(c(18717, 18808, 18900, 18992,
19082, 19173, 19265, 19357, 19447, 19538, 19630, 19722), class = "Date"),
A = c(0.043, 0.044, 0.044, 0.044, 0.044, 0.046, 0.048, 0.049,
0.05, 0.05, 0.05, 0.051), B = c(-0.002, -0.001, 0.002, 0.008,
0.015, 0.02, 0.024, 0.025, 0.025, 0.023, 0.022, 0.022)), row.names = c(NA,
-12L), class = "data.frame")