r - 根据日期将权重应用于数据帧中的列



我有两个数据帧,如下所示:

在线DF :

month     index      Jevons
201408    1.0000000  1.0000000
201409    0.9881163  0.9881163
201410    0.9685963  0.9353384
201411    0.9772775  0.8951670
201412    0.9570516  0.7550252
201501    0.9614457  0.7520039
201502    0.9888529  0.7204573
201503    0.8893120  0.7124263

离线DF:

month     index      Jevons
201408    1.0000000  1.0000000
201409    0.9881163  0.9881163
201410    0.9685963  0.9353384
201411    0.9772775  0.8951670
201412    0.9570516  0.7550252
201501    0.9614457  0.7520039
201502    0.9888529  0.7204573
201503    0.8893120  0.7124263

为了方便起见,我用相同的数字填充了两个数据帧,但实际上数据帧中的数字是不同的,并且每个数据帧都有我拥有数据的不同时间段。

我有在线和离线 Jevons 的权重,例如 2014 年在线 Jevons 的权重为 23.2(因此离线权重为76.8),2015 年在线 Jevons 的权重为 25.6(因此离线权重为 74.5)。

我想做的是能够将所有在线2014年的Jevons数据乘以23.2,将所有在线2015年的Jevons数据乘以25.6,然后在离线数据帧中,所有2014年的数据乘以76.8,所有2015年的数据乘以74.5。

理想情况下,对于在线数据,我的输出看起来像这样......

month     index      Jevons       weightedJevons
201408    1.0000000  1.0000000    0.2320000
201409    0.9881163  0.9881163    0.2292430
201410    0.9685963  0.9353384    0.2169985
201411    0.9772775  0.8951670    0.2076787
201412    0.9570516  0.7550252    0.1751658
201501    0.9614457  0.7520039    0.1925130
201502    0.9888529  0.7204573    0.1844371
201503    0.8893120  0.7124263    0.1823811

我最初使用了一个变异函数,但这只允许我应用一年的体重,而不是在 2015 年改变它。所以后来我试图创建自己的函数,但惨败了......

我从这样的事情开始...

onlineweightFun <- function(x, y){
if(x starts_with(2014)){
y *  0.232
}
if(x starts_with(2015)){
y * 0.256
}
}

并尝试了这个的变化,直到我决定在这里问你们。任何帮助将不胜感激!您可以使用以下方法轻松模拟我的数据帧:

month <- c("201408", "201409", "201410", "201411", "201412", "201501", "201502", "201503")
index <- c(1.0000000, 0.9881163, 0.9685963, 0.9772775, 0.9570516, 0.9614457, 0.9888529, 0.8893120)
Jevons <- c(1.0000000, 0.9881163, 0.9353384, 0.8951670, 0.7550252, 0.7520039, 0.7204573, 0.7124263)
onlinedf <- data.frame(month, index, Jevons)

我们可以使用substring提取年份信息,然后根据年份信息使用case_when来计算权重。onlinedf2是最终输出。

library(dplyr)
onlinedf2 <- onlinedf %>%
mutate(Year = substring(month, 1, 4)) %>%
mutate(weightedJevons = case_when(
Year == "2014"               ~ Jevons * 0.232,
Year == "2015"               ~ Jevons * 0.256,
TRUE                         ~ NA_real_
)) %>%
select(-Year)
onlinedf2
#    month     index    Jevons weightedJevons
# 1 201408 1.0000000 1.0000000      0.2320000
# 2 201409 0.9881163 0.9881163      0.2292430
# 3 201410 0.9685963 0.9353384      0.2169985
# 4 201411 0.9772775 0.8951670      0.2076787
# 5 201412 0.9570516 0.7550252      0.1751658
# 6 201501 0.9614457 0.7520039      0.1925130
# 7 201502 0.9888529 0.7204573      0.1844371
# 8 201503 0.8893120 0.7124263      0.1823811

为什么不只是:

month <- c("201408", "201409", "201410", "201411", "201412", "201501", "201502", "201503")
index <- c(1.0000000, 0.9881163, 0.9685963, 0.9772775, 0.9570516, 0.9614457, 0.9888529, 0.8893120)
Jevons <- c(1.0000000, 0.9881163, 0.9353384, 0.8951670, 0.7550252, 0.7520039, 0.7204573, 0.7124263)
onlinedf <- data.frame(month, index, Jevons, stringsAsFactors = FALSE)
result <- ifelse(startsWith(onlinedf$month, "2014"), onlinedf$Jevons * 0.232, onlinedf$Jevons * 0.256)

最新更新