繁体   English   中英

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 名称为“Year”(第一列)后跟 79065 列,其中每列的名称由从 50 到 300 开始的字符串组成,后面是重复 1 到 15 次的“.R”,以及从 10 到 30 的“.yr”。这带来 251(50-300) x 15(R) x 21(10-30) = 79065 列 例如:“Year”、“50.R1.10.yr”、 “50.R1.11.yr”、“50.R1.12.yr”、...“50.R1.30.yr”、“51.R1.10.yr”、“51.R1.11.年”、“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”列上的值赋予更多权重。 和下面一个电源function,重量减轻到“300.”。

适合我的值的方程是幂 function: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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM