首页 > 解决方案 > R:For循环从多个数据帧中捕获数据

问题描述

我想创建一些函数来获得所需的输出。我正在学习 R,因此很难创建代码。

这些是我想为更大的数据集创建的示例数据框

数据框 1:

 Item   LC1    LC2   LC3
8T4121  MW92    OY01    RM11
AB7654  MW92    WK14    RM11
AB7654  MW92    WK14    RS11

数据框 2:

 Item   LC   custfcst
8T4121  MW92    10
8T4121  OY01    12
8T4121  RM11    10
AB7654  MW92    20
AB7654  WK14    10
AB7654  RM11    8
AB7654  RS11    21

数据框 3:

 Item    LC     ToLC    Rolledfcst
8T4121  MW92    OY01    22
8T4121  OY01    RM11    10
AB7654  MW92    WK14    30
AB7654  WK14    RM11    12
AB7654  WK14    RS11    10

数据框 4:

Item    LC      Safetystock(SS)       X
8T4121  MW92    15                   .25
8T4121  OY01    7                    .25
8T4121  RM11    5                    .25
AB7654  MW92    30                   .25
AB7654  WK14    8                    .25
AB7654  RM11    20                   .25
AB7654  RS11    15                   .25

预期输出:

 Item   LC1      Pcntg     Share       RemSS    FinalSS        Leftover
8T4121  MW92   10/(22+10)  Pcntg*SS  SS-Share   Share+X*RemSS  SS-FinalSS
8T4121  OY01   12/(10+12)  Pcntg*SS  SS-Share   Share+X*RemSS  SS-FinalSS
8T4121  RM11       NA

注意:此处剩余的项目 8T4121 和 LC1 应添加到数据帧 4 的 SafetyStock 中,用于相同的项目,然后只有下一次计算应该发生在 8T4121 和 OY01

步骤: 1. 在Dataframe中,item从LC1-->LC2-->LC3流出的lane

  1. 对于输出,每个 Item 一个,custfcst 应取自 DF2,Rolledfcst 应取自 DF3 以计算 Pcntg
  2. 同理,Share、RemSS、FinalSS、Leftover 也要计算

  3. 在我们计算出第一个项目的剩余部分后,应将剩余部分添加到同一项目的下一个 LC 的安全库存中

  4. 当我们最后在 Dataframe 1 中为特定项目找到 LC 时,应该只添加前一个 Lc 的 SS+Leftover。无需进一步计算。

在项目 AB7654 的情况下,第 14 周的 aster 计算应该在 RM11 和 RS11 之间平均分配剩余的 SS

标签: rdataframefor-loop

解决方案


这是一个Tidyverse使用left_join多次将数据框连接在一起的解决方案:

library(dplyr)
library(tidyr)

df1 %>%
  as_tibble() %>%
  gather(key = LC_ref, value = LC, - Item) %>%
  left_join(select(df2, -Item), by = "LC") %>%
  left_join(select(df3, -Item, -ToLC), by = "LC") %>%
  mutate(percentage = ifelse(is.na(custfcst) | is.na(Rolledfcst), NA, paste(custfcst, Rolledfcst, sep = "/")),
         percentage_numerical = 100 * custfcst / Rolledfcst) %>%
  select(Item, LC, percentage, percentage_numerical)

# A tibble: 3 x 4
  Item   LC    percentage percentage_numerical
  <chr>  <chr> <chr>                     <dbl>
1 8T4121 MW92  10/22                      45.5
2 8T4121 OY01  12/10                     120  
3 8T4121 RM11  NA                         NA  

推荐阅读