2016-12-13 2 views
1

이것은 두 부분으로 나뉩니다.두 그룹으로 고유 수 찾기

먼저 요청을 처리하는 사용자가 있습니다.

User Voucher Number System Entry Date Queue Entry Date Queue Exit Date 
user1 100004 8/11/2016 10:40 8/11/2016 10:40 8/11/2016 14:48 
user2 100004 8/11/2016 10:40 8/11/2016 14:48 8/12/2016 16:11 
user1 100004 8/11/2016 10:40 8/12/2016 16:11 8/18/2016 16:09 
user3 100004 8/11/2016 10:40 8/18/2016 16:09 8/18/2016 16:11 
user1 100004 8/11/2016 10:40 8/18/2016 16:11 10/12/2016 10:07 
user2 100004 8/11/2016 10:40 10/12/2016 10:07 10/13/2016 13:34 
user3 100004 8/11/2016 10:40 10/13/2016 14:57 10/13/2016 14:57 
user4 1030003 8/18/2016 9:45 8/22/2016 16:02 8/24/2016 11:41 
user2 1030003 8/18/2016 9:45 8/24/2016 11:41 8/29/2016 18:40 
user1 1030003 8/18/2016 9:45 8/29/2016 18:40 8/29/2016 18:54 
user1 1030003 8/18/2016 9:45 8/29/2016 18:54 8/29/2016 18:54 

는 궁극적으로 나는 Queue Entry Date에 의해 매일 처리하는 방법을 많은 요청 정량화 할 필요가있다. 문제는 요청이 사용자에 의해 닫히고 동일한 사용자가 다시 열 때가 있습니다. 마지막 두 행에 표시됩니다.

"user""Queue Entry Date"이 이전 줄과 같으면 두 번째 인스턴스가 제거됩니다.

나는이를 확인 루프를 개발하지만 두 가지 문제가 있습니다

(1) 루프가 매우 느리고 (2) 나는 열려 3 번 이상 폐쇄 바우처를 가지고 말 같은 사용자가 순차적으로, 나는 프로그램이 이것을 어떻게 처리 할 것인지 완전히 확신하지 못한다.

가 궁극적으로 내가 같이하기 위해 테이블을 필요 :

바우처 수있을 것입니다 '큐 입국 날짜'의 기반 처리 상품권의 수를

User date voucher count 
user1 8/11/2016 3 
user2 8/11/2016 2 
user3 8/11/2016 2 
user4 8/11/2016 0 
user1 8/12/2016 1 
user2 8/12/2016 1 
user3 8/12/2016 0 
user4 8/12/2016 1 




df <- structure(list(User = structure(c(1L, 2L, 1L, 3L, 1L, 2L, 3L, 
4L, 2L, 1L, 1L), .Label = c(" user1", " user2", " user3", 
" user4"), class = "factor"), Voucher.Number = c(100004L, 
100004L, 100004L, 100004L, 100004L, 100004L, 100004L, 1030003L, 
1030003L, 1030003L, 1030003L), System.Entry.Date = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("8/11/2016 10:40", 
"8/18/2016 9:45"), class = "factor"), Queue.Entry.Date = structure(c(3L, 
4L, 5L, 6L, 7L, 1L, 2L, 8L, 9L, 10L, 11L), .Label = c("10/12/2016 10:07", 
"10/13/2016 14:57", "8/11/2016 10:40", "8/11/2016 14:48", "8/12/2016 16:11", 
"8/18/2016 16:09", "8/18/2016 16:11", "8/22/2016 16:02", "8/24/2016 11:41", 
"8/29/2016 18:40", "8/29/2016 18:54"), class = "factor"), Queue.Exit.Date = structure(c(4L, 
5L, 6L, 7L, 1L, 2L, 3L, 8L, 9L, 10L, 10L), .Label = c("10/12/2016 10:07", 
"10/13/2016 13:34", "10/13/2016 14:57", "8/11/2016 14:48", "8/12/2016 16:11", 
"8/18/2016 16:09", "8/18/2016 16:11", "8/24/2016 11:41", "8/29/2016 18:40", 
"8/29/2016 18:54"), class = "factor")), .Names = c("User", "Voucher.Number", 
"System.Entry.Date", "Queue.Entry.Date", "Queue.Exit.Date"), class = "data.frame", row.names = c(NA, 
-11L)) 

이것은 내가 사용되는 루프입니다 필터링 :

:
counter = 0 
filtDf = data.frame() 
for (elem in 1:nrow(df)){ 

    if (counter >0){ 
    curElementId <- df[counter,c(4,12)] 
    prev <- df[elem,c(4,12)] 
    if (curElementId[1,1] == prev[1,1] & curElementId[1,2] == prev[1,2]){ 
     filtDf <- rbind(filtDf,df[elem,]) 
    } 
    else{ 
     filtDf <- rbind(filtDf,df[elem,]) 
    } 
    } 
    counter = counter + 1 
} 

그런 다음 주파수 테이블을 작성 다음 사용
filtDf$date<- as.POSIXct(filtDf$Queue.Exit.Date,format="%d/%d/%Y %H:%M") 
filtDf$date <- as.character(round(filtDf$date , "day")) 

dd <- ddply(filtDf , .(Queue.Entry.Date,User) , summarise , Count = length(User)) 
+0

원하는 결과의 숫자가 어디서 왔는지 모르겠지만 'library (dplyr); %> % count (사용자 (%)) % (%)/% d (% , Queue.Entry.날짜)' – alistaire

+0

출력이 혼란 스럽습니까? 'user4'의 레코드는 어디에서 사라졌습니까? –

+0

@ joel.wilson 예 – DataTx

답변

1

이렇게하면됩니다. 첫째, 모든 날짜 열을 mdy_hm에서 lubrdidate (나는 위의 @ Frank의 의견에 동의 함)을 사용하여 실제 datetime 객체로 변환 한 다음 항목 datetime으로 정렬하여 순서가 맞는지 확인합니다. 그런 다음 lag을 사용하여 행이 사용자와 항목 날짜 모두에 대해 앞의 행과 일치하는지 확인합니다. 첫 번째 입력에 대해서는 NA이되며, 해당 항목을 제외하지 않도록해야하므로 tidyrreplace_na을 사용하여 첫 번째 입력을 FALSE으로 전환합니다. 그런 다음 필터에 걸리지 않은 것만을 보관하고 날짜는 count입니다.

df %>% 
    mutate_at(vars(System.Entry.Date, Queue.Entry.Date, Queue.Exit.Date) 
      , mdy_hm) %>% 
    mutate(toFilt = (User == lag(User) & 
        as.Date(Queue.Entry.Date) == lag(as.Date(Queue.Entry.Date)))) %>% 
    replace_na(replace = list(toFilt = FALSE)) %>% 
    filter(!toFilt) %>% 
    count(User, Date = as.Date(Queue.Entry.Date)) 

반환 값 :이 는 샘플 출력과 일치하지 않지만, 샘플 출력은 당신이 게시 된 데이터와 일치하지 않습니다

 User  Date  n 
     <fctr>  <date> <int> 
1  user1 2016-08-11  1 
2  user1 2016-08-12  1 
3  user1 2016-08-18  1 
4  user1 2016-08-29  1 
5  user2 2016-08-11  1 
6  user2 2016-08-24  1 
7  user2 2016-10-12  1 
8  user3 2016-08-18  1 
9  user3 2016-10-13  1 
10  user4 2016-08-22  1 

참고. 그래서 나는 그곳에서 무슨 일이 일어 났는지 확신하지 못한다. 당신이 다시 0 클래스를 얻고 싶은 경우에, 당신은 complete를 사용할 수 있습니다

df %>% 
    mutate_at(vars(System.Entry.Date, Queue.Entry.Date, Queue.Exit.Date) 
      , mdy_hm) %>% 
    arrange(Queue.Entry.Date) %>% 
    mutate(toFilt = (User == lag(User) & 
        as.Date(Queue.Entry.Date) == lag(as.Date(Queue.Entry.Date)))) %>% 
    replace_na(replace = list(toFilt = FALSE)) %>% 
    filter(!toFilt) %>% 
    count(User, Date = as.Date(Queue.Entry.Date)) %>% 
    complete(User, Date = full_seq(Date, 1), fill = list(n = 0)) 

이 포함 당신의 범위에서 모든 날짜를 원하지 않는 경우, 그냥 대신 full_seq 기능의 Date를 사용합니다.

+0

답에 많은 감사를드립니다. "." – DataTx

+0

'.'은 관심 그룹 (그룹핑 변수로 구분 된)을 의미합니다. 도움을 볼 때,'mutate_each'가 사용되지 않을 것이라는 점을 상기 시켰습니다. (funs (mdy_hm (. '? arrange'는 내림차순으로 정렬하는'desc' 함수를 보여줄 것입니다 (기본값은 오름차순입니다).'-'는 일반적으로 잘 작동하지만, 문서화되어 있지는 않습니다 –

+0

최신 버전이 작동하지 않는 것 같습니다 "UseMethod ("tbl_vars ")의 오류 : "tbl_vars "의 적용 가능한 메소드가"function "클래스의 객체에 적용되지 않았습니다." – DataTx