Jak spočítat dny mezi výskyty skupin

0

Otázka

Snažím, jak mohu spočítat množství dnů mezi jednotlivými případy, protože musím spočítat, kolik dní trvá od chovu na zařízení.

Mám datovém s mnoha zařízení a data udávající údržbu, pak musím počítat dny mezi údržby pro každé zařízení. Ukážu hračku příklad:

test = data.frame(car = c("A", "A", "B", "B", "B", "C", "C", "D",  "D", "D", "E"), 
                   maintenance_date= c("20-09-2020", "25-09-2020", "14-05-2020", "20-05-2020", "20-05-2021", "11-01-2021", "13-01-2021", "13-01-2021", "15-01-2021", "15-01-2021", "13-01-2021"))
#test
#   car      maintenance_date
#1    A            20-09-2020
#2    A            25-09-2020
#3    B            14-05-2020
#4    B            20-05-2020
#5    B            20-05-2021
#6    C            11-01-2021
#7    C            13-01-2021
#8    D            13-01-2021
#9    D            15-01-2021
#10   D            15-01-2021
#11   E            13-01-2021

#for result, I'd like something like:
result
#   car     maintenance_date
#1    A         5
#2    B         6
#3    B       365
#4    C         2
#5    D         2
#6    D         0

Myslel jsem, že používáte něco jako test %>% arrange(maintenance_date) %>% group_by(car) %>% ....

Jakýkoli náznak o tom, jak to můžu udělat?

dplyr r
2021-11-23 16:21:32
3

Nejlepší odpověď

4

Musíme převést na Date třídy ještě před tím, než arrange a pak to group_by "auto" a ten diffzdíl

library(dplyr)
library(lubridate)
test %>% 
   mutate(maintenance_date = dmy(maintenance_date)) %>% 
   arrange(maintenance_date) %>% 
   group_by(car) %>%
   summarise(maintenance_date = diff(maintenance_date), .groups = 'drop')

-výstup

# A tibble: 6 × 2
  car   maintenance_date
  <chr> <drtn>          
1 A       5 days        
2 B       6 days        
3 B     365 days        
4 C       2 days        
5 D       2 days        
6 D       0 days        
2021-11-23 16:27:07

funguje perfektně pro mě.
DR15
3

data.tabulka

library(data.table)
setDT(test)
test[, maintenance_date := as.Date(maintenance_date, format="%d-%m-%Y")
  ][, .(ndays = diff(maintenance_date)), by = car]
#       car      ndays
#    <char> <difftime>
# 1:      A     5 days
# 2:      B     6 days
# 3:      B   365 days
# 4:      C     2 days
# 5:      D     2 days
# 6:      D     0 days
2021-11-23 16:27:14
2

Další řešení, tidyversebázi, může být:

library(tidyverse)
library(lubridate)

test = data.frame(car = c("A", "A", "B", "B", "B", "C", "C", "D",  "D", "D", "E"), maintenance_date= c("20-09-2020", "25-09-2020", "14-05-2020", "20-05-2020", "20-05-2021", "11-01-2021", "13-01-2021", "13-01-2021", "15-01-2021", "15-01-2021", "13-01-2021"))

test  %>% 
  group_by(car) %>% 
  mutate(maintenance_date = c(-1,diff(dmy(maintenance_date)))) %>% 
  filter(maintenance_date >= 0) %>% ungroup

#> # A tibble: 6 × 2
#> # Groups:   car [4]
#>   car   maintenance_date
#>   <chr>            <dbl>
#> 1 A                    5
#> 2 B                    6
#> 3 B                  365
#> 4 C                    2
#> 5 D                    2
#> 6 D                    0
2021-11-23 19:31:40

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................