R - 基于列字符串值的多列的行加权平均值

R - Weighted Mean by row for multiple columns based on columns string values

我有 2020 年观测值和 79066 个变量的 data.frame“DF”。 第一列是从 1 到 2020 连续跨越的“年”,其他变量是值。

首先,我按行取平均值,以便每年获得一个平均值。

例如

Aver <- apply(DF[,2:79066], 1, mean, na.rm=TRUE)

但是,我想进行加权平均,权重值因列字符串值而异。

变量的header名称为“年”(第一列)后跟79065列,其中每列的名称由一个从50到300开头的字符串,后跟“。 R" 重复 1 到 15 次,".yr" 重复 10 到 30 次。这带来 251(50-300) x 15(R) x 21(10-30) = 79065 列 例如。 : "年", "50.R1.10.yr", "50.R1.11.yr", "50.R1.12.yr", ... "50.R1.30.yr", "51.R1.10.yr", "51.R1.11.yr", "51.R1.12.yr", ... "51.R1. 30.yr", ..."300.R1.10.yr", "300.R1.11.yr", "300.R1.12.yr", ..." 300.R1.30.yr", "50.R2.10.yr", "50.R2.11.yr", "50.R2.12.yr", ... "50.R2.30.yr", "51.R2.10.yr", "51.R2.11.yr", "51.R2.12.yr", .. . "51.R2.30.yr", ..."300.R2.10.yr", "300.R2.11.yr", "300.R2.12.yr ", ... "300.R2.30.yr", ... "50.R15.10.yr", "50.R15.11.yr", "50.R15.12.yr", ... "300.R15.30.yr".

我想分配给每列的权重基于字符串值 50 到 300。我想为列“50”上的值赋予更多权重。并遵循幂函数,将重量减至“300”。

拟合我的值的方程是幂函数:y = 2305.2*x^-1.019.

例如

av.classes <- data.frame(av=seq(50, 300, 1))
library(dplyr)
av.classes.weight <- av.classes %>% mutate(weight = 2305.2*av^-1.019)

感谢您的帮助。

我想你可以这样得到你的权重向量:

library(tidyverse)

weights_precursor <- str_split(names(data)[-1], pattern = "\.", n = 2, simplify = TRUE)[, 1] %>% 
  as.numeric()

weights <- 2305.2 * weights_precursor ^ -1.019

设置一些示例数据:

DF <- data.frame(year=2020,`50.R1.10.yr`=1,`300.R15.30.yr`=10)
names(DF) <- stringr::str_remove(names(DF),"X")

获取数值向量:

weights <- stringr::str_split(names(DF),"\.")
weights <- sapply(1:length(weights),function(x) weights[[x]][1])[-1]
as.numeric(weights)