【问题标题】:R - 2 for loops to get none 0 data can be optimized?R - 2 for loops to get none 0 数据可以优化吗?
【发布时间】:2021-09-13 10:04:17
【问题描述】:

我又一次求助于 SO Gods 来帮助我,因为我只是一个凡人的程序员。

我有 2 个DataFrames Op 和 fwd。

即使我输入的行数太多而无法放在这里,它们也确实太大了。这就是为什么我只输入前 20 行。

fwd = structure(list(Dates = structure(c(18779, 18780, 18781, 18782, 
18783, 18784, 18785, 18786, 18787, 18788, 18789, 18790, 18791, 
18792, 18793, 18794, 18795, 18796, 18797, 18798), class = "Date"), 
    CAL1.num = c(2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 
    2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 2022L, 
    2022L, 2022L, 2022L, 2022L), CAL2.num = c(2023L, 2023L, 2023L, 
    2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 
    2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 2023L, 2023L), 
    CAL3.num = c(2024L, 2024L, 2024L, 2024L, 2024L, 2024L, 2024L, 
    2024L, 2024L, 2024L, 2024L, 2024L, 2024L, 2024L, 2024L, 2024L, 
    2024L, 2024L, 2024L, 2024L), CAL1.prix = c(20.7198630136986, 
    20.5709826758316, 20.5416570682562, 20.1627967508327, 19.5804662519739, 
    19.970595583085, 19.8936930981244, 19.598362502073, 19.8008353366899, 
    19.8038507758495, 19.5289796563554, 19.7658386493753, 19.5078559900235, 
    19.3052695609575, 19.1955268594179, 19.3754495791108, 19.3013180873984, 
    19.4454161579162, 19.8524627413157, 19.8965952683892), CAL2.prix = c(17.9395616438356, 
    17.9420914607196, 17.9607954381744, 17.7250235708918, 17.3068986556031, 
    17.5655735706712, 17.4205222954918, 17.156263873053, 17.3336837635027, 
    17.3420560988812, 17.2226393449218, 17.2839803603736, 17.0980024668028, 
    16.955907646717, 16.9389288476745, 17.1480589434091, 17.034948349062, 
    17.0495808702106, 17.3617641445812, 17.4449687857862), CAL3.prix = c(16.8487431693989, 
    16.7476370720291, 16.6119480947879, 16.3651399362189, 16.069183915644, 
    16.2355843497187, 16.2713389578965, 16.1073762918961, 16.3063152846391, 
    16.3621047950222, 16.3258984487073, 16.3618578134152, 16.2591922615945, 
    16.0804320226449, 16.0739980313506, 16.3870819039359, 16.5066329864522, 
    16.513327927322, 16.7687609933202, 16.8776662523007), QUARTER1.nom = c("Q3 2021", 
    "Q3 2021", "Q3 2021", "Q3 2021", "Q3 2021", "Q3 2021", "Q3 2021", 
    "Q3 2021", "Q3 2021", "Q3 2021", "Q3 2021", "Q3 2021", "Q3 2021", 
    "Q3 2021", "Q3 2021", "Q3 2021", "Q3 2021", "Q3 2021", "Q3 2021", 
    "Q3 2021"), QUARTER2.nom = c("Q4 2021", "Q4 2021", "Q4 2021", 
    "Q4 2021", "Q4 2021", "Q4 2021", "Q4 2021", "Q4 2021", "Q4 2021", 
    "Q4 2021", "Q4 2021", "Q4 2021", "Q4 2021", "Q4 2021", "Q4 2021", 
    "Q4 2021", "Q4 2021", "Q4 2021", "Q4 2021", "Q4 2021"), QUARTER3.nom = c("Q1 2022", 
    "Q1 2022", "Q1 2022", "Q1 2022", "Q1 2022", "Q1 2022", "Q1 2022", 
    "Q1 2022", "Q1 2022", "Q1 2022", "Q1 2022", "Q1 2022", "Q1 2022", 
    "Q1 2022", "Q1 2022", "Q1 2022", "Q1 2022", "Q1 2022", "Q1 2022", 
    "Q1 2022"), QUARTER4.nom = c("Q2 2022", "Q2 2022", "Q2 2022", 
    "Q2 2022", "Q2 2022", "Q2 2022", "Q2 2022", "Q2 2022", "Q2 2022", 
    "Q2 2022", "Q2 2022", "Q2 2022", "Q2 2022", "Q2 2022", "Q2 2022", 
    "Q2 2022", "Q2 2022", "Q2 2022", "Q2 2022", "Q2 2022"), QUARTER1.prix = c(24.4009782608696, 
    23.8791293344845, 23.6895439878102, 23.1986796056566, 22.3253285022921, 
    22.6640748439239, 22.7646092945935, 22.281369465237, 22.4915701163657, 
    22.2460826351854, 21.9641008808891, 22.3943073066212, 21.9430552443109, 
    21.5838423137683, 21.5216100604998, 21.7183538434616, 21.6178630431267, 
    22.0840523702174, 22.5758311437561, 22.5797108901139), QUARTER2.prix = c(25.2263043478261, 
    24.7192160211123, 24.5643273242301, 24.1333672230736, 23.4826299624358, 
    24.0155578900935, 24.1022650172914, 23.854421232743, 23.9063239026515, 
    23.7167326854575, 23.3461717065084, 23.6767791363945, 23.2928412004004, 
    22.8239297903667, 22.8206587737937, 22.9449903236577, 22.9170029906723, 
    23.2600872568113, 23.7352326859226, 23.7318277693714), QUARTER3.prix = c(25.5061111111111, 
    25.0924453041838, 24.9438104415761, 24.4516395089059, 23.734597082601, 
    24.1836860520103, 24.2425714820358, 23.9608801643543, 24.0077045012931, 
    23.8625790300674, 23.4938582233503, 23.8204360345224, 23.4585802827627, 
    23.0648009364399, 23.0503755079289, 23.2072021288566, 23.1679045472902, 
    23.4704615774202, 23.9887249226929, 24.0296246878244), QUARTER4.prix = c(18.8628571428571, 
    18.7936780601555, 18.76113878006, 18.3719593325938, 17.8063028446364, 
    18.1714236251237, 18.0405795878287, 17.6842019501597, 17.9633497185463, 
    18.0350331708269, 17.812021591911, 18.0312294037435, 17.789591687912, 
    17.6312927680928, 17.4703292692614, 17.6630817559893, 17.5288070986573, 
    17.6155053427362, 17.9832674813674, 18.0256484510743), MONTH1.nom = c("M7 2021", 
    "M7 2021", "M7 2021", "M7 2021", "M7 2021", "M7 2021", "M7 2021", 
    "M7 2021", "M7 2021", "M7 2021", "M7 2021", "M7 2021", "M7 2021", 
    "M7 2021", "M7 2021", "M7 2021", "M7 2021", "M7 2021", "M7 2021", 
    "M7 2021"), MONTH2.nom = c("M8 2021", "M8 2021", "M8 2021", 
    "M8 2021", "M8 2021", "M8 2021", "M8 2021", "M8 2021", "M8 2021", 
    "M8 2021", "M8 2021", "M8 2021", "M8 2021", "M8 2021", "M8 2021", 
    "M8 2021", "M8 2021", "M8 2021", "M8 2021", "M8 2021"), MONTH3.nom = c("M9 2021", 
    "M9 2021", "M9 2021", "M9 2021", "M9 2021", "M9 2021", "M9 2021", 
    "M9 2021", "M9 2021", "M9 2021", "M9 2021", "M9 2021", "M9 2021", 
    "M9 2021", "M9 2021", "M9 2021", "M9 2021", "M9 2021", "M9 2021", 
    "M9 2021"), MONTH4.nom = c("M10 2021", "M10 2021", "M10 2021", 
    "M10 2021", "M10 2021", "M10 2021", "M10 2021", "M10 2021", 
    "M10 2021", "M10 2021", "M10 2021", "M10 2021", "M10 2021", 
    "M10 2021", "M10 2021", "M10 2021", "M10 2021", "M10 2021", 
    "M10 2021", "M10 2021"), MONTH1.prix = c(24.56, 24.0316394164205, 
    23.8305607727713, 23.3221443581862, 22.4181924739579, 22.7652505249174, 
    22.8359195995121, 22.3440978554473, 22.5744708270217, 22.296982351325, 
    22.0146497904558, 22.4464255212171, 21.9827906537189, 21.6061923844531, 
    21.5728465276548, 21.77154858271, 21.6812999231947, 22.160502823575, 
    22.6461706466308, 22.6825679056712), MONTH2.prix = c(24.33, 
    23.8197624908486, 23.6363342114893, 23.165393738618, 22.3090561325133, 
    22.6543048025027, 22.7611323512942, 22.2877324620753, 22.4832702720456, 
    22.2509377861053, 21.9572024521086, 22.3882935479875, 21.9350221930074, 
    21.5849317681906, 21.5175910522709, 21.7067681832549, 21.6032068733244, 
    22.0762504646336, 22.5643986056167, 22.5493770956657), MONTH3.prix = c(24.31, 
    23.7828813215745, 23.5988100788821, 23.1054947573159, 22.2461838470091, 
    22.5696223496993, 22.6945148209203, 22.2099750319535, 22.4144825544854, 
    22.1884692725573, 21.9189953840767, 22.3466660354603, 21.9102961409363, 
    21.5596214711576, 21.4728186862763, 21.6753577951185, 21.5674563091854, 
    22.0131155375179, 22.5149606135297, 22.5047702283011), MONTH4.prix = c(24.76, 
    24.2277487078825, 24.0712491465489, 23.6427115413029, 23.0102312371408, 
    23.5583299448447, 23.6502693471086, 23.4325414986478, 23.4861175143973, 
    23.3201907140291, 22.9323618250847, 23.2700400258469, 22.8766635305259, 
    22.399491320035, 22.3966520753529, 22.5201036501858, 22.4954814039879, 
    22.8385990939485, 23.3133721389017, 23.3282933797103)), row.names = c(NA, 
20L), class = "data.frame")


Op = structure(list(Dates = c("2021-06-01", "2021-06-02", "2021-06-03", 
"2021-06-04", "2021-06-05", "2021-06-06", "2021-06-07", "2021-06-08", 
"2021-06-09", "2021-06-10", "2021-06-11", "2021-06-12", "2021-06-13", 
"2021-06-14", "2021-06-15", "2021-06-16", "2021-06-17", "2021-06-18", 
"2021-06-19", "2021-06-20"), `M6 2021` = c(0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
    `M7 2021` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `M8 2021` = c(0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L), `M9 2021` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `M10 2021` = c(-0.73, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    `M11 2021` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0), `M12 2021` = c(0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
    `M1 2022` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0), `M2 2022` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M3 2022` = c(0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M4 2022` = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    `M5 2022` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0), `M6 2022` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `M7 2022` = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    `M8 2022` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0), `M9 2022` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `M10 2022` = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    `M11 2022` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0), `M12 2022` = c(0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
    `M1 2023` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0), `M2 2023` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M3 2023` = c(0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L), `M4 2023` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0), `M5 2023` = c(0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M6 2023` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `M7 2023` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M8 2023` = c(0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M9 2023` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `M10 2023` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M11 2023` = c(0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M12 2023` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `M1 2024` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M2 2024` = c(0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M3 2024` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `M4 2024` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M5 2024` = c(0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M6 2024` = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    `M7 2024` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0), `M8 2024` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M9 2024` = c(0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L), `M10 2024` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0), `M11 2024` = c(0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `M12 2024` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `M1 2025` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `M2 2025` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `M3 2025` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `M4 2025` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `M5 2025` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `M6 2025` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `M7 2025` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `M8 2025` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `M9 2025` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `M10 2025` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `M11 2025` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `M12 2025` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `Q2 2021` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `Q3 2021` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `Q4 2021` = c(0.73, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `Q1 2022` = c(0.51, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    `Q2 2022` = c(-0.1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0), `Q3 2022` = c(0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `Q4 2022` = c(0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `Q1 2023` = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    `Q2 2023` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0), `Q3 2023` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `Q4 2023` = c(0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `Q1 2024` = c(0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    `Q2 2024` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0), `Q3 2024` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `Q4 2024` = c(0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `Q1 2025` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `Q2 2025` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `Q3 2025` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `Q4 2025` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), `Y 2021` = c(0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L), `Y 2022` = c(0.9, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `Y 2023` = c(1, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `Y 2024` = c(0.88, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 
    `Y 2025` = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), row.names = c(NA, 20L
), class = "data.frame")

我想做的是:

  1. 从 Op 中选择值不为零的行(假设第 1、2 行有值)
  2. 对于这些行 (1, 2) 中的每一行,选择没有 0 的列
  3. 遍历这些行的这些列以获取该列名称
  4. 在 DataFrame 中找到名为 fwd 的列名
  5. 根据列名的名称和类型以及行值从 fwd 中获取一个值
  6. 将此值乘以 Op 的值
  7. 将这些值相加

我需要帮助优化的代码是:

      res = 0
      
      Mat = Op
      
      for (i in which (rowSums (abs (Mat[, -1])) != 0))
      {
        for (j in (which (Mat[i, -1] != 0) + 1))
        {
          produit = colnames (Mat)[j]
          
          if (substr (produit, 1, 1) == "M") prix = fwd[i, which (as.character (fwd[i, ]) == produit) + 4] 
          if (substr (produit, 1, 1) == "Q") prix = fwd[i, which (as.character (fwd[i, ]) == produit) + 4] 
          if (substr (produit, 1, 1) == "Y") prix = fwd[i, which (paste0 ("Y ", fwd[i, ]) == produit) + 3]
          
          res = res +  as.numeric (Mat[i, j] * prix)
        }
      }

【问题讨论】:

  • 你到底乘的是什么?您能否给出前几个预期输出,即Op[1, 'M10 2021'] 大于零。它会乘以什么?
  • fwd的名称也应该有nomnum的后缀吗?
  • 您的根本问题是您的数据不是tidy。这样做,你的生活会变得更轻松:一开始就没有循环!另外,您的问题没有明确说明。在步骤 4 中,fwd 中没有列名满足在步骤 1-3 中派生的过滤器。但是,有一些列包含这些值。请澄清您的问题。
  • 您在 Op 和 fwd 中的 colnames 完全不同,所以您所说的 step-3 没有意义?
  • 回答 cmets:1) 预期的输出 res 只是 Op 中的值乘以 fwd 中的值的总和 2) 后缀是 .nom(如法语中的名称) 3) 是 colnames(Op) != colnames(fwd),但没有第 3 步没有用,因为您正在第 i 行中搜索 Op 的列名。您正在搜索将 4 或 3 添加到 j 以获取要与之相乘的值的 (j) 列

标签: r for-loop dplyr nested


【解决方案1】:

你可以这样做:

Op %>%
  pivot_longer(-Dates) %>%
  filter(value != 0 ) %>%
  mutate(Dates = as.Date(Dates)) %>%
  left_join(pivot_longer(fwd, -Dates,
                         names_to = c('key', '.value'), 
                         names_sep = '\\.') %>%
              mutate(name = coalesce(nom, paste('Y', num))),
            by = c("Dates", "name")) %>%
  summarise(value = sum(value*prix))

 A tibble: 1 x 1
  value
  <dbl>
1  62.9

【讨论】:

  • 我会检查并告诉你
  • 您忘记了需要合并名称的 cal 列。我修复了它,它现在可以了,所以我做了一个更正,因为它只是需要一个简单的更正。谢谢
猜你喜欢
  • 2021-04-24
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
相关资源
最近更新 更多