2016-11-01 1 views
0

나는 시작 30 분 휴식과 시간 간격을 만들기 위해 몇 가지 어려움이 중 전체 시간의 00 또는 전체 시간의 00 및 30 분에 : 예를 들어계수 계수를 계산할 때 균등 간격 간격을 얻는 방법은 무엇입니까?

:

library(reshape2) 
    library(dplyr) 

    # Given some data which resemble the original data 
    foo <- data.frame(start.time = c("2012-02-01 13:47:00", 
            "2012-02-01 14:02:00", 
            "2012-02-01 14:20:00", 
            "2012-02-01 14:40:00", 
            "2012-02-01 15:08:00", 
            "2012-02-01 16:01:00", 
            "2012-02-01 16:02:00", 
            "2012-02-01 16:20:00", 
            "2012-02-01 17:09:00", 
            "2012-02-01 18:08:00", 
            "2012-02-01 18:20:00", 
            "2012-02-01 19:08:00" 



            ), 
         employee = c("mike","john","john","steven","mike","mike","mike","steven","mike","steven","mike","mike")) 


          start.time employee 
      #1 2012-02-01 13:47:00  mike 
      #2 2012-02-01 14:02:00  john 
      #3 2012-02-01 14:20:00  john 
      #4 2012-02-01 14:40:00 steven 
      #5 2012-02-01 15:08:00  mike 
      #6 2012-02-01 16:01:00  mike 
      #7 2012-02-01 16:02:00  mike 
      #8 2012-02-01 16:20:00 steven 
      #9 2012-02-01 17:09:00  mike 
      #10 2012-02-01 18:08:00 steven 
      #11 2012-02-01 18:20:00  mike 
      #12 2012-02-01 19:08:00  mike 




    # change factor to POSIXct 
    foo$start.time <- as.POSIXct(foo$start.time) 
    # long to wide 
    my_emp<- dcast(foo, start.time ~ employee, fun.aggregate = length) 
    # 30 min breaks 
    my_emp_ag<- my_emp %>% group_by(start.time = as.POSIXct(cut(start.time, breaks="30 min"))) %>% 
     summarize(john = sum(john),mike = sum(mike),steven = sum(steven)) 
    # Missing intervalls 
    miss_interval <- data.frame(start.time=seq(from = min(as.POSIXct(my_emp$start.time)), to= max(as.POSIXct(my_emp$start.time)), by = "30 mins")) 

    # join old woth new 
    substitited <- left_join(miss_interval,my_emp_ag,by=c('start.time')) 
    # change NA to zero 
    substitited[is.na(substitited)] <- 0 

           start.time john mike steven 
        1 2012-02-01 13:47:00 1 1  0 
        2 2012-02-01 14:17:00 1 0  1 
        3 2012-02-01 14:47:00 0 1  0 
        4 2012-02-01 15:17:00 0 0  0 
        5 2012-02-01 15:47:00 0 2  0 
        6 2012-02-01 16:17:00 0 0  1 
        7 2012-02-01 16:47:00 0 1  0 
        8 2012-02-01 17:17:00 0 0  0 
        9 2012-02-01 17:47:00 0 0  1 
        10 2012-02-01 18:17:00 0 1  0 
        11 2012-02-01 18:47:00 0 1  0 

2012-02-01 13:30:00을 원하는대로 거의이다 2012-02-01 14:00:00 등등.

+0

기본적으로 분을 00 또는 30으로 반올림 하시겠습니까? – Elin

+0

안녕하세요 @ 엘린, 나는 같은 30 분 간격 내에서 emplees를 계산하고 싶습니다. 'dplyr'와'cut '을 사용하여 그룹화하는 것은 사용하기 아주 좋습니다. 그러나 나는 전체 시간 또는 해당 횟수와 함께 30 분으로 시간을 반올림하는 방법을 모릅니다. – Mamba

+0

이렇게하면 2012-02-01 16:00:00부터 2012-02-01 16:30:00까지 총 3 개가 생깁니 까? "2012-02-01 16:01:00", "2012-02-01 16:02:00", "2012-02-01 16:20:00"로 생각하면됩니다. 요소에는 간격이 없으므로 요인. 그것들을 숫자로 생각하고 빈 너비를 만들어야합니다. – Elin

답변

1
library(data.table) 
library(lubridate) 

setDT(foo)[, `:=` (
    round.time = { 
    todate = ymd_hms(start.time) 
    rounddate = floor_date(todate, "30 minutes") 
    } 
)] 


      start.time employee   round.time 
1: 2012-02-01 13:47:00  mike 2012-02-01 13:30:00 
2: 2012-02-01 14:02:00  john 2012-02-01 14:00:00 
3: 2012-02-01 14:20:00  john 2012-02-01 14:00:00 
4: 2012-02-01 14:40:00 steven 2012-02-01 14:30:00 
5: 2012-02-01 15:08:00  mike 2012-02-01 15:00:00 
6: 2012-02-01 16:01:00  mike 2012-02-01 16:00:00 
7: 2012-02-01 16:02:00  mike 2012-02-01 16:00:00 
8: 2012-02-01 16:20:00 steven 2012-02-01 16:00:00 
9: 2012-02-01 17:09:00  mike 2012-02-01 17:00:00 
10: 2012-02-01 18:08:00 steven 2012-02-01 18:00:00 
11: 2012-02-01 18:20:00  mike 2012-02-01 18:00:00 
12: 2012-02-01 19:08:00  mike 2012-02-01 19:00:00 
+0

'foo'를 사용하여 오류가 발생합니다. match.arg (단위) 오류 : 'arg '는 "초", "분", "시", "일", "주", "월" , "year", "quarter"' – Mamba

+0

정보가 없으면이를 재현 할 수 없습니다. lubridate와 data.table을 설치하고로드 했습니까? – Henk

+0

우분투 14.04.5에서'lubridate_1.5.6''data.table_1.9.6'을 사용 중입니다. LTS – Mamba

관련 문제