如何低估 R 中某些条件下的小时值

How to underestimate the values of hours under certain conditions in R

我有数据集

wrong=structure(list(SAP = c("W609", "W609", "W609", "W609", "W609", 
"W609", "W609", "W609", "W609"), weekd = c(1L, 1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L), tab = c(1003L, 1004L, 1005L, 1001L, 1003L, 1004L, 
1002L, 1003L, 1005L), date = c(20220404L, 20220404L, 20220404L, 
20220405L, 20220405L, 20220405L, 20220406L, 20220406L, 20220406L
), kod = c(690L, 690L, 690L, 801L, 690L, 690L, 690L, 690L, 690L
), timeStart = c(12L, 12L, 10L, 10L, 12L, 12L, 10L, 12L, 12L), 
    timeEnd = c(22L, 22L, 20L, 20L, 22L, 22L, 20L, 22L, 22L)), class = "data.frame", row.names = c(NA, 
-9L))

如果在特定的 SAP 上,在一周中的某一天工作 strictly 3 people 不多也不少 (tab column) 并且一些选项卡具有相同的 timeStart 和 timeEnd,如何做到这一点,例如, 两个 tabs = 1003tab= 1004 同时从 12 点到 22 点工作,所以我需要为任何一个选项卡随机更改 1 小时,例如 11 点到 21 点。

嗯,比如手动,我是这样弄的 期望的输出

   SAP weekd  tab     date kod timeStart timeEnd
1 W609     1 1003 20220404 690        12      22
2 W609     1 1004 20220404 690        **11      21**
3 W609     1 1005 20220404 690        10      20
4 W609     2 1001 20220405 801        10      20
5 W609     2 1003 20220405 690        **11      21**
6 W609     2 1004 20220405 690        12      22
7 W609     3 1002 20220406 690        10      20
8 W609     3 1003 20220406 690        **11      21**
9 W609     3 1005 20220406 690        12      22

换句话说,我随机选择了一个timeStarttimeEnd相同的选项卡并将它们降低了一个小时。

因此,如果我们有三个具有相同 timestarttimeend 的选项卡,那么,例如 12-22,那么一个将具有 10-20,第二个具有 11-21,第三个有 12-22.

我怎样才能正确地进行这些转换? 感谢您的帮助。

您可以为具有重复的 timeStart 和 timeEnd 的每个选项卡创建索引。有了这些索引后,通过过滤这些索引,可以迭代为每个 timeStart 和 timeEnd 减去 1,过滤索引的第一行除外。

我刚刚简化了您的示例数据,因为唯一需要的列是制表符、timeStart 和 timeEnd。我还通过添加一些不同的行来丰富您的数据,以便能够测试不同的场景。

  wrong=structure(list(tab = c(1003L, 1004L, 1005L, 1001L, 1003L, 1004L,1002L, 1003L, 1005L,1003L,1003L,1003L,1005L), 
                     timeStart = c(12L, 12L, 10L, 10L, 12L, 12L, 10L, 12L, 12L,11L,10L,11L,10L),
                     timeEnd = c(22L, 22L, 20L, 20L, 22L, 22L, 20L, 22L, 22L,21L,20L,21L,20L)), 
                class = "data.frame", 
                row.names = c(NA,-13L))

我刚刚创建了一个以数据和选项卡作为参数的函数。

schedule_editer = function(data, tab_n) {

  wrong_f = data %>%
    filter(tab == tab_n) %>%
    mutate(Time = str_c(timeStart, timeEnd, sep = "_")) %>%
    arrange(Time) %>%
    mutate(Index = cumsum(!duplicated(Time)))
  
  listing = list()
  
  for (i in min(wrong_f$Index):max(wrong_f$Index)) {

    if (nrow(wrong_f %>% filter(Index == i)) == 1) {

      listing[[i]] = wrong_f %>% filter(Index == i)
      
    } else {

      wrong_f_i = wrong_f %>% filter(Index == i)
      wrong_f_i[-1, "timeStart"] = wrong_f_i[-1, "timeStart"] - c(1:nrow(wrong_f_i[-1, ]))
      wrong_f_i[-1, "timeEnd"] = wrong_f_i[-1, "timeEnd"] - c(1:nrow(wrong_f_i[-1, ]))
      listing[[i]] = wrong_f_i %>% mutate(Time = str_c(timeStart, timeEnd, sep = "_"))

    }
    
  }
  
  do.call(rbind, listing)
  
}

首先我们过滤一下1003的标签,看看应该配置的数据。

wrong %>%
  filter(tab == 1003)

   tab timeStart timeEnd
1 1003        12      22
2 1003        12      22
3 1003        12      22
4 1003        11      21
5 1003        10      20
6 1003        11      21

现在让我们试试创建的函数,看看它是否能满足我们的需求。

schedule_editer(wrong, 1003)

   tab timeStart timeEnd  Time Index
1 1003        10      20 10_20     1
2 1003        11      21 11_21     2
3 1003        10      20 10_20     2
4 1003        12      22 12_22     3
5 1003        11      21 11_21     3
6 1003        10      20 10_20     3