[英]< R > Sum elements of a column, based on dates and events in R
我正在嘗試計算機器中不同部件的壽命(以小時為單位)。 為此,我有以下信息:
示例數據集:
set.seed(89)
hoursWorked <- floor(runif(122, min=1, max=16))
Replacement <- floor(runif(122, min=0, max=2))
dt<- as.data.frame(cbind(hoursWorked, Replacement)) %>%
mutate(PieceReplaced= ifelse(Replacement==1,cbind(c("X", "Y")) ,NA),
datesample=seq(as.Date("2020-01-01"), as.Date("2020-05-01"), by="days"))%>%
select(datesample, everything())
因此,我想總結自上次更換特定部件以來機器的運行時間。 結果將如下所示:
dt$averagetime[1:10] <- c(0,0,2+14, NA, 13+12, 14+12+13+15, 15+12, NA, NA, NA)
這些部件計划在一天開始時更換,因此更換日的工作時間包括在下一次更換中
我非常感謝我在一段時間內一直被這個問題所困擾的幫助。 謝謝!!!
繼續tidyverse
,您可以嘗試以下方法。
首先,使用mutate
和cumsum
計算每天的累計小時數。 在此之前不會使用group_by
,因為它包括每天記錄的所有時間,與片斷更換無關。
然后,您可以按PieceReplaced
分組,並使用每件作品的累積小時數差異。
這提供了與建議的 output 相似的結果,除了第一個 Y 件可以考慮至少 2 小時,在該點之前的時間未知。
dt <- as.data.frame(cbind(hoursWorked, Replacement)) %>%
mutate(PieceReplaced= ifelse(Replacement==1,cbind(c("X", "Y")) ,NA),
datesample=seq(as.Date("2020-01-01"), as.Date("2020-05-01"), by="days"))%>%
select(datesample, everything()) %>%
mutate(CumHours = lag(cumsum(hoursWorked), default = 0)) %>%
group_by(PieceReplaced) %>%
mutate(TimeSinceReplaced = ifelse(Replacement == 1, CumHours - lag(CumHours, default = 0), NA))
Output
# A tibble: 122 x 6
# Groups: PieceReplaced [3]
datesample hoursWorked Replacement PieceReplaced CumHours TimeSinceReplaced
<date> <dbl> <dbl> <chr> <dbl> <dbl>
1 2020-01-01 2 1 X 0 0
2 2020-01-02 14 1 Y 2 2
3 2020-01-03 12 1 X 16 16
4 2020-01-04 13 0 NA 28 NA
5 2020-01-05 15 1 X 41 25
6 2020-01-06 12 1 Y 56 54
7 2020-01-07 4 1 X 68 27
8 2020-01-08 1 0 NA 72 NA
9 2020-01-09 15 0 NA 73 NA
10 2020-01-10 4 0 NA 88 NA
11 2020-01-11 2 0 NA 92 NA
12 2020-01-12 8 0 NA 94 NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.