2015-02-02 4 views
0

다음과 같은 데이터 세트가 제공됩니다. 주어진 시간 중 특정 시간 (00:00, 01:00, ...., 22:00, 23:00)이 주어진 간격 내에서 완전히 벗어나는 횟수를 계산하고 싶습니다.시간 간격 세트에서 정규 시간 간격의 발생 계산 R

발생 날짜는 중요하지 않습니다. 그냥 전체 카운트.

### This code is to create a data set similar to the one I am using. 

### This is a function I found on here to generate random times 
latemail <- function(N, st="2012/01/01", et="2012/12/31") { 
    st <- as.POSIXct(as.Date(st)) 
    et <- as.POSIXct(as.Date(et)) 
    dt <- as.numeric(difftime(et,st,unit="sec")) 
    ev <- sort(runif(N, 0, dt)) 
    rt <- st + ev 
} 

set.seed(123) 
startTimes <- latemail(5) 
    endTimes <- startTimes +18000 

my_data <- data.frame(startTimes, endTimes) 

> my_data 
       start     end 
1 2012-04-14 16:10:44 2012-04-14 21:10:44 
2 2012-05-28 23:38:16 2012-05-29 04:38:16 
3 2012-10-14 10:33:10 2012-10-14 15:33:10 
4 2012-11-17 23:13:56 2012-11-18 04:13:56 
5 2012-12-08 22:29:36 2012-12-09 03:29:36 

잘하면 내 작업에 대한 아이디어를 얻을 수 있습니다.

출력은 시간당 하나의 변수와 발생 횟수에 대한 데이터 세트가있는 것이 이상적입니다. 이처럼

hour count 
1 00:00  3 
2 01:00  3 
3 etc  ? 

다른 증분 (15 분)으로이를 수행하는 방법도 알아두면 좋습니다.

감사합니다.

+0

"특정 시간"을 어떻게 계산할지는 불투명합니다. 간격이 있습니다. 예를 들어 시작 시간이 16:10:44이고 종료 시간이 21:10:44 인 경우 16 (+1), 17 (+1), 18 (+1), 19 (+1)을 계산 하시겠습니까? , 20 (+1) 및 21 (+1)? 당신은 당신의 기준을 명확히 할 수 있습니까? – jazzurro

+0

"완전히 내립니다"라는 말은 시간 간격이 완전히 간격에 포함되어있는 경우에만 시간이 계산된다는 아이디어를 얻으려고했습니다. 귀하의 예는 16:00 또는 21:00로 계산되지 않습니다. 그것이 불분명 한 경우 사과드립니다. – Michael

답변

0

내 시도입니다. 나는이 일을하는 더 좋은 방법이 있다고 확신합니다. 위의 의견을 감안할 때, 나는 다음과 같이했다. 첫째, 나는 을 사용하여 hour을 차지했습니다. 귀하가 귀하의 의견에 설명했듯이, 여기에 반올림했습니다. hour. transmute을 사용하여 시간을 포함한 문자열을 가져오고 싶습니다. 경우에 따라 시작 시간이 종료 시간보다 클 수 있습니다 (이 경우 레코드는 날짜를 교차합니다). 이를 처리하기 위해 setdiff(), c()toString()을 사용했습니다. 별도의 시간을 사용하여 시간을 구분합니다. splitstackshape 패키지의 cSplit()을 사용하고 싶지만 오류 메시지가 다시 나타납니다. 따라서 여기에서 separate()을 선택했습니다. 모든 시간을 분리 한 후에는 gather()을 사용하여 데이터를 다시 구성하고 hourcount()으로 최종 계산했습니다. NA 사례를 제거하기 위해 filter()이 사용되었습니다. 이것이 어느 정도 도움이되기를 바랍니다.

** Data ** 

structure(list(startTimes = structure(c(1328621832.79254, 1339672345.94964, 
1343434566.9641, 1346743867.55964, 1355550696.37895), class = c("POSIXct", 
"POSIXt")), endTimes = structure(c(1328639832.79254, 1339690345.94964, 
1343452566.9641, 1346761867.55964, 1355568696.37895), class = c("POSIXct", 
"POSIXt"))), .Names = c("startTimes", "endTimes"), row.names = c(NA, 
-5L), class = "data.frame") 

#   startTimes   endTimes 
#1 2012-02-07 22:37:12 2012-02-08 03:37:12 
#2 2012-06-14 20:12:25 2012-06-15 01:12:25 
#3 2012-07-28 09:16:06 2012-07-28 14:16:06 
#4 2012-09-04 16:31:07 2012-09-04 21:31:07 
#5 2012-12-15 14:51:36 2012-12-15 19:51:36 

library(dplyr) 
library(tidyr) 

mutate(my_data, start = ifelse(as.numeric(format(startTimes, "%M")) >= 0 & as.numeric(format(startTimes, "%S")) > 0, 
           as.numeric(format(startTimes, "%H")) + 1, 
           as.numeric(format(startTimes, "%H"))), 
       end = ifelse(as.numeric(format(endTimes, "%M")) >= 0 & as.numeric(format(endTimes, "%S")) > 0, 
          as.numeric(format(endTimes, "%H")) - 1, 
          as.numeric(format(endTimes, "%H"))), 
       start = replace(start, which(start == "24"), 0), 
       end = replace(end, which(end == "-1"), 23)) %>% 
rowwise() %>% 
transmute(hour = ifelse(start < end, toString(seq.int(start, end, by = 1)), 
         toString(c(setdiff(seq(0, 23, by = 1), seq.int(end, start, by = 1)), 
            start, end)))) %>% 
separate(hour, paste("hour", 1:24, sep = "."), ", ", extra = "merge") %>% 
gather(foo, hour) %>% 
count(hour) %>% 
filter(complete.cases(hour)) 

# hour n 
#1  0 2 
#2  1 1 
#3 10 1 
#4 11 1 
#5 12 1 
#6 13 1 
#7 15 1 
#8 16 1 
#9 17 2 
#10 18 2 
#11 19 1 
#12 2 1 
#13 20 1 
#14 21 1 
#15 22 1 
#16 23 2 
+0

답변 해 주셔서 감사합니다. 코드가 실제로 작동하는 경우 멋질 것입니다. "my_data"는 실제로 생성되지 않았으며 "stringi"패키지를 설치하고로드해야했습니다. 내 자신의 데이터로 실행하려고하면 "오류 : 호환되지 않는 유형, 문자 벡터가 나타납니다."가 계속 나타납니다. – Michael

+0

@ 마이클 귀하의 회신에 감사드립니다. 'my_data'가 실제로 생성되지 않는다는 것을 의미한다는 것을 명확히 할 수 있습니까? 나는'dput()'을 사용하여 데이터를 얻었습니다. 이것은 "구조체 .."로 시작하는 청크입니다. 당신은'my_data <- structure ..... '를 할 필요가있다. 나는'stringi' 패키지를 코드에서 사용하지 않았습니다. 도움이 더 필요하면 알려주세요. – jazzurro

+0

당신 말이 맞습니다. my_data <- structure .....를 추가하면 예제가 실행됩니다. 어떤 이유로 my_data와 똑같은 POSIXct 두 개를 사용하는 데이터에 코드를 적용하려고하면 transmute() 함수에서 "오류 : 호환되지 않는 유형이며 숫자 벡터가 필요합니다"라는 오류 메시지를 표시합니다. https://github.com/hadley/dplyr/issues/464와 관련이 있는지 확실하지 않습니다. 답장을 보내 주셔서 감사합니다. – Michael