如何低估 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 = 1003
和 tab= 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
换句话说,我随机选择了一个timeStart
和timeEnd
相同的选项卡并将它们降低了一个小时。
因此,如果我们有三个具有相同 timestart
和 timeend
的选项卡,那么,例如 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
我有数据集
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 = 1003
和 tab= 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
换句话说,我随机选择了一个timeStart
和timeEnd
相同的选项卡并将它们降低了一个小时。
因此,如果我们有三个具有相同 timestart
和 timeend
的选项卡,那么,例如 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