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)
我有 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)