我有一個包含 2020 年觀測值和 79066 個變數的 data.frame “DF”。第一列是從 1 到 2020 連續跨越的“年份”,其他變數是值。
在第一種情況下,我逐行進行平均,以便每年獲得一個平均值。
例如
Aver <- apply(DF[,2:79066], 1, mean, na.rm=TRUE)
但是,我想做一個加權平均,權重值因列字串值而異。
變數的標題名稱是“Year”(第一列),后跟79065列,其中每列的名稱由一個從50到300開頭的字串組成,后面是“.R”重復1到15次,以及從 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”列上的值賦予更多權重。并遵循冪函式,將權重減至“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)
感謝您的任何幫助。
uj5u.com熱心網友回復:
我想你可以像這樣得到你的權重向量:
library(tidyverse)
weights_precursor <- str_split(names(data)[-1], pattern = "\\.", n = 2, simplify = TRUE)[, 1] %>%
as.numeric()
weights <- 2305.2 * weights_precursor ^ -1.019
uj5u.com熱心網友回復:
設定一些示例資料:
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/408332.html
標籤:
