0

我正在尝试获取一个 for 循环来迭代 x 中的每个总回报列,如果列名包括 Jan、Apr、Jul 或 Oct,则通过将其替换为 Rebal_Wgt 列来改变 Data 中的 Index.Wgt 列。

在其他月份,Index.Wgt 将按总回报增长,然后重新调整以使总和等于 100%。

目的是进行季度再平衡,其中 Index.Wgt 列在某些月份返回模型权重 (Rebal_Wgt),然后输出是每月性能,基本上是 Index.Wgt 乘以总回报。

我正在努力让 %like% 在 ifelse 语句中工作。

for (col in TR){

  Data <- Data %>% mutate(Index.Wgt = ifelse(col %like% "Jan", Rebal_Wgt, Index.Wgt))

Data <- Data %>% mutate(Index.Wgt = ifelse(col %like% "Apr", Rebal_Wgt, Index.Wgt))

Data <- Data %>% mutate(Index.Wgt = ifelse(col %like% "Jul", Rebal_Wgt, Index.Wgt))

Data <- Data %>% mutate(Index.Wgt = ifelse(col %like% "Oct", Rebal_Wgt, Index.Wgt))

 Data.Perf <- Data %>% summarise(Data.Perf = sum(Index.Wgt * col,na.rm=T))

 Data <- Data %>% ungroup() %>% mutate(Index.Wgt = (Index.Wgt * col) / sum(Index.Wgt*col, na.rm=T))

  print(Data.Perf)

}

输入(数据): structure(list(Rebal_Wgt = c(0.02, 0.01, 0.1, 0.2, 0.1, 0.07, 0.05, 0.3, 0.15), Index.Wgt = c(0.02, 0.01, 0.1, 0.2, 0.1, 0.07, 0.05, 0.3, 0.15), TR_May17 = c(1.001715422, 0.98909569, 1.04555547, 1.008702517, 1.05057454, 0.95632559, 1.07556725, 1.09333086, 1.04512179), TR_Jun17 = c(1.06285512, 0.999283433, 1.03150094, 0.98932916, 0.92823368, 1.1172496, 0.97140139, 1.005518198, 1.01058865 ), TR_Jul17 = c(1.03446233, 0.97522825, 1.00325048, 1.05024529, 0.995382786, 1.0008474588, 0.992340744, 0.993811727, 1.006075501 ), TR_Aug17 = c(1.0369637, 1.00775516, 1.003725171, 1.01596558, 0.998266757, 0.8973751, 1.02135468, 1.1324508, 1.06614256), TR_Sep17 = c(0.98839235, 1.0913459, 0.98217118, 0.98601937, 1.008270502, 0.9818216, 1.008661747, 1.003833294, 1.01179886), TR_Oct17 = c(1.07337248, 1.01357305, 1.07230222, 0.95614499, 0.90512866, 1.06055939, 1.04648316, 1.04047477, 1.02447152), TR_Nov17 = c(1.08895445, 1.090137, 1.005505204, 1.04227471, 1.09307396, 1.09874511, 0.995394289, 1.0394758, 0.994479656 ), TR_Dec17 = c(0.96620947, 1.05399835, 1.002799153, 1.02100229, 1.0007432699, 1.03871107, 1.002479553, 1.04314768, 0.98584384 ), TR_Jan18 = c(1.07402694, 1.05999053, 0.98904955, 0.94688976, 0.97579116, 1.09064746, 1.02705634, 1.03444982, 1.1802717), TR_Feb18 = c(0.95514828, 0.90726733, 0.94584322, 0.90942782, 0.94013864, 0.9825564, 0.94669902, 0.92929512, 0.9307037), TR_Mar18 = c(0.94939065, 0.9835301, 0.98667991, 1.009679079, 1.02305841, 0.994206607, 1.04424369, 0.96199369, 0.990624368), TR_Apr18 = c(1.1046729, 1.03680432, 0.98704648, 0.92119348, 0.97509712, 1.02934968, 1.08532143, 0.96402019, 1.01884139 ), TR_May18 = c(1.02161586, 1.01502717, 0.9526943, 1.01147366, 0.96223599, 1.04986119, 0.998944104, 1.002378702, 0.990111709 )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L))

数据表 数据

TR 表 总回报

4

1 回答 1

0

没有ifelse和没有for-loop

Data <- Data %>%
  mutate(across(matches("Jan|Apr|Jul|Oct"), ~Rebal_Wgt))
于 2021-12-16T09:01:09.077 回答