如何考虑到数字的减法对数据进行排序,直到在R中获得正确的数字

vaqhlq81  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(130)

我有一个与数据分类有关的复杂问题。
问题简介。下面是两个表格,包括相同单位的年度粒度数据。
第一个表指的是每台机组每年的负荷。

    • 表1.每年的负荷**

| 年份|单位A|单位B|单元C|单位D|
| - ------|- ------|- ------|- ------|- ------|
| 二○二三|五千|四千|三千|二○ ○ ○年|
| 小行星2024|五千|四千|三千|二○ ○ ○年|
| 小行星2025|五千|四千|三千|无|
| 二○二六|无|四千|三千|无|
| 小行星2027|无|无|三千|无|
第二个表是指每台设备每年的边际价格。

    • 表2.每年边际成本**

| 年份|单位A|单位B|单元C|单位D|
| - ------|- ------|- ------|- ------|- ------|
| 二○二三|一百二十|二百四十|一百七十|一百五十|
| 小行星2024|一百四十|二百五十|一百八十|一百七十五|
| 小行星2025|一百六十|二百七十|一百九十|无|
| 二○二六|无|三百|二百|无|
| 小行星2027|无|无|二一五|无|
我希望上表中的单元以这样的方式排序,即匹配从最低边际成本(表2)开始,并持续到总负载(表1)达到表3中的假设水平(表3中的第3列)。下面我介绍了我希望解决方案如何处理排序后的数据。
预期解决方案:* * 表3.分类单位**
| 年份|小时|所需负载|||||缺少负载(所需负载-总单位负载)|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 二○二三|三个|一万|单位A|单位D|* * C股**||无|
| 二○二三|四个|小行星135|单位A|单位D|单元C|* * 单位B**|一千|
| ...|...|...|...|...|...|...|...|
| 小行星2025|五个|八千|单位A|单元C|||无|
| 小行星2025|六个|小行星18000|单位A|单元C|* * 单位B**||六千|
更好、更准确的方法是给出边际成本而不是单位名称,因为我感兴趣的是哪个单位以什么边际成本结束了这一堆(哪个是最贵的单位),比如:
| 年份|小时|所需负载|||||缺少负载(所需负载-总单位负载)|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 二○二三|三个|一万|一百二十|一百五十|* * 一百七十人**||无|
| ...|...|...|...|...|...|...|...|
| 小行星2025|五个|八千|一百六十|* * 一百九十**|||无|
我尝试了不同的方法,但不幸的是,我没有找到正确的方法来排序这种方式。
非常感谢您的建议和解决方案。

y4ekin9u

y4ekin9u1#

library(tidyverse)

Tab1 <- tribble(
~Year,  ~UnitA, ~UnitB, ~UnitC, ~UnitD,
2023,   5000,   4000,   3000,   2000,
2024,   5000,   4000,   3000,   2000,
2025,   5000,   4000,   3000,   0,
2026,   0,  4000,   3000,   0,
2027,   0,  0,  3000,   0)

Tab2 <- tribble(
  ~Year,    ~UnitA, ~UnitB, ~UnitC, ~UnitD,
  2023, 120,    240,    170,    150,
  2024, 140,    250,    180,    175,
  2025, 160,    270,    190,    0,
  2026, 0,  300,    200,    0,
  2027, 0,  0,  215,    0)

Tab3 <- tribble(
  ~Year,    ~Hour,  ~Req_load,
  2023, 3,  10000,
  2023, 4,  13500,
  2025, 5,  8000,
  2025, 6,  18000,
)

consolidatedTab <- Tab1 %>%
  pivot_longer(cols = -c(Year), names_to = "Unit", names_prefix = "Unit", values_to = "load") %>%
  left_join(Tab2 %>%
              pivot_longer(cols = -c(Year), names_to = "Unit", names_prefix = "Unit", values_to = "marg")
            ) %>%
  group_by(Year) %>%
  arrange(marg, .by_group = TRUE) %>%
  mutate(totLoad = cumsum(load))

SummaryTab <- Tab3 %>%
  rowwise() %>%
  mutate(missingLoad = ifelse(Req_load - max(consolidatedTab[consolidatedTab$Year == Year,]$totLoad) <= 0,
         0,
         Req_load - max(consolidatedTab[consolidatedTab$Year == Year,]$totLoad)
         ),
         finalUnit = ifelse(missingLoad >0, "N/A", first(consolidatedTab[consolidatedTab$Year == Year & consolidatedTab$totLoad > Req_load,]$Unit)),
         finalunitprice = ifelse(missingLoad >0, 0, first(consolidatedTab[consolidatedTab$Year == Year & consolidatedTab$totLoad > Req_load,]$marg))
         )

我尽了最大努力,抱歉没有解释但我得走了!
给出:

>head(consolidatedTab)
# A tibble: 6 × 5
# Groups:   Year [2]
   Year Unit   load  marg totLoad
  <dbl> <chr> <dbl> <dbl>   <dbl>
1  2023 A      5000   120    5000
2  2023 D      2000   150    7000
3  2023 C      3000   170   10000
4  2023 B      4000   240   14000
5  2024 A      5000   140    5000
6  2024 D      2000   175    7000
>

以及

>
# A tibble: 4 × 6
# Rowwise: 

       Year  Hour Req_load missingLoad finalUnit finalunitprice
      <dbl> <dbl>    <dbl>       <dbl> <chr>              <dbl>
    1  2023     3    10000           0 B                    240
    2  2023     4    13500           0 B                    240
    3  2025     5     8000           0 B                    270
    4  2025     6    18000        6000 N/A                    0

相关问题