【问题标题】:Applying weights to columns in a dataframe according to dates根据日期将权重应用于数据框中的列
【发布时间】:2018-07-09 08:16:51
【问题描述】:

我有两个如下所示的数据框:

onlinedf :

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

离线f:

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

我最初使用了一个 mutate 函数,但这只允许我应用一年的权重,而不是在 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)

【问题讨论】:

    标签: r function date dplyr data-manipulation


    【解决方案1】:

    我们可以使用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
    

    【讨论】:

    • 这非常有效 - 甚至没有想到使用 case_when。当其他人工作得更好时,很容易陷入使用相同的功能。谢谢!
    【解决方案2】:

    为什么不只是:

    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)
    

    【讨论】:

    • 谢谢 - 这确实有效,但在单独的向量中返回结果。虽然,诚然,只需要一行额外的代码来添加它做原始数据帧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多