2016-11-03 16 views
-1

私は、ユーザIDに拠るタイムスタンプの違いを知りたいと思います。ここでは、ログインとログアウトのステータスを持つユーザーの違いを測定したいだけです。いくつかのユーザーは、ログインステータスのみをログアウトすることができます。彼らのために私はちょうどNAとしてDEMをマークしたいと思います:いくつかの条件でタイムスタンプの差を計算するにはどうすればよいですか?

一部のデータを:

library(dplyr) 
    start <- as.POSIXct("2012-01-15") 
    interval <- 70 
    end <- start + as.difftime(1, units="days") 
    tseq<- seq(from=start, by=interval*70, to=end) 
    employeID <-c("1_e","1_e","2_b","2_b","3_c","3_c","100_c","4_d","4_d","52_f","9_f","9_f","7_u","7_u","10_5","22_2","33_a","33_a") 
    status<- c("login","logout","login","logout","login","logout","login","logout","login","logout","login","logout","login","logout","logout","login","logout","login") 
    # put together 
    data <- data.frame(tseq, employeID, status) 

      tseq   employeID status 
    #1 2012-01-15 00:00:00  1_e login 
    #2 2012-01-15 01:21:40  1_e logout 
    #3 2012-01-15 02:43:20  2_b login 
    #4 2012-01-15 04:05:00  2_b logout 
    #5 2012-01-15 05:26:40  3_c login 
    #6 2012-01-15 06:48:20  3_c logout 
    #7 2012-01-15 08:10:00  100_c login 
    #8 2012-01-15 09:31:40  4_d logout 
    #9 2012-01-15 10:53:20  4_d login 
    #10 2012-01-15 12:15:00  52_f logout 
    #11 2012-01-15 13:36:40  9_f login 
    #12 2012-01-15 14:58:20  9_f logout 
    #13 2012-01-15 16:20:00  7_u login 
    #14 2012-01-15 17:41:40  7_u logout 
    #15 2012-01-15 19:03:20  10_5 logout 
    #16 2012-01-15 20:25:00  22_2 login 
    #17 2012-01-15 21:46:40  33_a logout 
    #18 2012-01-15 23:08:20  33_a login 


    test<- data %>% 
    group_by(employeID) %>% 
    mutate(time.difference = tseq - lag(tseq)) 

しかし、唯一のこの行は、一定の時間を作るように見える

+2

これは、あなたの例で定数を作成したためです。各タイムスタンプは、 'seq'で定義したように' interval * 70'の間隔を持っています。だから '70 * 70 = 1.3611時間。 問題ありません。 – cderv

+0

ご質問を停滞させないでください。いくつかの回答とコメントがありますが、いずれにも返信していません。少なくとも、働いているか働いていないかを私たちに知らせてください。 – rosscova

答えて

2

どのように時間差を計算します。主に、summariseが必要なときにmutateを使用しているようです。また、私は、「ログアウト」の文字に要因からstatus列を変換し、そして唯一の「ログイン」との両方を持つユーザーを取るためifelse文を含めましたエントリ:

test <- data %>% 
    mutate(status = as.character(status)) %>% 
    group_by(employeID) %>% 
    summarise(time.difference = ifelse("login" %in% status && "logout" %in% status, 
             difftime(tseq[ status == "logout" ], tseq[ status == "login" ]), 
             NA) 
    ) 

います:

> head(test) 
# A tibble: 6 × 2 
employeID time.difference 
     <fctr>   <dbl> 
1  1_e  1.361111 
2  10_5    NA 
3  100_c    NA 
4  2_b  1.361111 
5  22_2    NA 
6  3_c  1.361111 

他の人が示唆しているように、データには一定の時間間隔が含まれているため、関連する値がある場合は常に同じです。私はあなたの実際のデータが少し違って見えるので、より感覚的な出力を得るでしょう。

+0

"login"と "logout"の両方を持つ 'employeID'だけを含むようにあなたの例を修正しました:' data%>%group_by(employeID)%>%dplyr :: filter( "login"%in%status& dplyr :: summarize(interval = difftime(tseq [ステータス== "ログアウト"]、tseq [ステータス== "ログイン"])) ' – seasmith

+0

OPはそれらをNAとしてマークしておくことを望んでいました。「ログインステータスをログアウトするユーザーがいくつかありますが、私はdemをNAとしてマークしたいと思います。だから、私は 'ifelse'をこう書いたのです。 – rosscova

0

定数time.differenceを生成するために思われます間隔:

tseq<- seq(from=start, by=interval*70, to=end) 

だから、もう一度違いを取ると、一定ではないでしょうか?

+0

私は同意しますが、回答ではなくコメントにすることをお勧めしますか? – rosscova

1

まず、各グループのカウントを調べることで、不対のステータスを持つグループをフィルタリングします。 dplyr::doで、私たちはその後 各グループこれについて

library(dplyr) 
    start <- as.POSIXct("2012-01-15") 
    interval <- 70 
    end <- start + as.difftime(1, units="days") 
    tseq<- seq(from=start, by=interval*70, to=end) 
    employeID <-c("1_e","1_e","2_b","2_b","3_c","3_c","100_c","4_d","4_d","52_f","9_f","9_f","7_u","7_u","10_5","22_2","33_a","33_a") 
    status<- c("login","logout","login","logout","login","logout","login","logout","login","logout","login","logout","login","logout","logout","login","logout","login") 
    # put together 
    DF <- data.frame(tseq, employeID, status) 

      tseq   employeID status 
    #1 2012-01-15 00:00:00  1_e login 
    #2 2012-01-15 01:21:40  1_e logout 
    #3 2012-01-15 02:43:20  2_b login 
    #4 2012-01-15 04:05:00  2_b logout 
    #5 2012-01-15 05:26:40  3_c login 
    #6 2012-01-15 06:48:20  3_c logout 
    #7 2012-01-15 08:10:00  100_c login 
    #8 2012-01-15 09:31:40  4_d logout 
    #9 2012-01-15 10:53:20  4_d login 
    #10 2012-01-15 12:15:00  52_f logout 
    #11 2012-01-15 13:36:40  9_f login 
    #12 2012-01-15 14:58:20  9_f logout 
    #13 2012-01-15 16:20:00  7_u login 
    #14 2012-01-15 17:41:40  7_u logout 
    #15 2012-01-15 19:03:20  10_5 logout 
    #16 2012-01-15 20:25:00  22_2 login 
    #17 2012-01-15 21:46:40  33_a logout 
    #18 2012-01-15 23:08:20  33_a login 


    testDF<- DF %>% 
    dplyr::group_by(employeID) %>% 
    dplyr::filter(count(unique(status)) > 1) %>% 
    dplyr::do(.,data.frame(logINTime =.$tseq[.$status=="login"],logOUTTime =.$tseq[.$status=="logout"], 
    deltaTime=difftime(.$tseq[.$status=="logout"],.$tseq[.$status=="login"],units="secs"))) %>% 
    as.data.frame() 


testDF 
    # employeID   logINTime   logOUTTime deltaTime 
# 1  1_e 2012-01-15 00:00:00 2012-01-15 01:21:40  4900 
# 2  2_b 2012-01-15 02:43:20 2012-01-15 04:05:00  4900 
# 3  3_c 2012-01-15 05:26:40 2012-01-15 06:48:20  4900 
# 4  33_a 2012-01-15 23:08:20 2012-01-15 21:46:40  -4900 
# 5  4_d 2012-01-15 10:53:20 2012-01-15 09:31:40  -4900 
# 6  7_u 2012-01-15 16:20:00 2012-01-15 17:41:40  4900 
# 7  9_f 2012-01-15 13:36:40 2012-01-15 14:58:20  4900 
+0

これはOPのアプローチと同じ結果をもたらしますが、かなり長いことが異なります。 – mtoto

関連する問題