2017-11-11 199 views
3

我有一個數據幀查找時間差

lf = structure(list(session_id = c(48L, 48L, 48L, 48L, 48L, 48L, 54L, 
54L, 54L, 54L, 54L, 54L, 72L, 72L, 72L, 72L, 72L, 74L, 74L, 74L, 
74L, 74L, 78L, 78L, 78L, 78L, 78L, 90L, 90L, 90L), datetime = structure(c(1457050110, 
1457050111, 1457050112, 1457050114, 1457050117, 1457050118, 1457052045, 
1457052048, 1457052050, 1457052051, 1457052052, 1457052054, 1457057067, 
1457057067, 1457057067, 1457057070, 1457057071, 1457058143, 1457058143, 
1457058144, 1457058149, 1457058150, 1457059193, 1457059193, 1457059195, 
1457059198, 1457059199, 1457063485, 1457063486, 1457063486), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), request = c(7, 7, 14, 20, 9, 4, 9, 
1, 12, 20, 6, 12, 4, 15, 8, 8, 12, 10, 6, 6, 13, 1, 5, 6, 20, 
1, 8, 3, 6, 13)), .Names = c("session_id", "datetime", "request" 
), row.names = c(NA, -30L), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame")) 

現在我想編寫一個函數,將採取一對的請求(request1,請求2)的這個子集輸入和因爲我上傳所需的輸出PIC

我已經使用這個代碼,但在尋找的時間差異WRT位置索引stucked產生輸出: -

lf1 = lf %>% group_by(session_id) %>% do(positions = match(c(1,6),.$request),session_duration = max(.$datetime)-min(.$datetime)) 

正如你SE EI參加了上述代碼的要求對(1,6)的一個實例,但想編寫一個函數做的工作

所需的輸出: - enter image description here

回答

2

在給定的情況下,你不必擔心關於明確的立場。只考慮(a)會議內的範圍和(b)會議內是否滿足兩個邊界。

另外,請注意意外遺留的分組。在管道/鏈條結束之前,我總是嘗試使用他們的ungroup()

lf <- lf %>% 
    dplyr::ungroup() 

lf %>% 
    dplyr::filter(request %in% c(1, 6)) %>% 
    dplyr::group_by(session_id) %>% 
    dplyr::summarize(
    has_both_boundaries = (any(request==1) & any(request==6)), 
    session_duration = as.integer(difftime(max(datetime), min(datetime), units="secs")) 
) %>% 
    dplyr::ungroup() %>% 
    dplyr::filter(has_both_boundaries) %>% 
    dplyr::select(-has_both_boundaries) %>% 
    dplyr::right_join(
    lf %>% 
     dplyr::distinct(session_id), 
    by = "session_id" 
) 

產地:

# A tibble: 6 x 2 
    session_id session_duration 
     <int>   <int> 
1   48    NA 
2   54    4 
3   72    NA 
4   74    7 
5   78    5 
6   90    NA 

你需要的會話48,72,90 &這些空行?如果沒有,則省略結束right_join()條款。

+0

接受你的答案..但我也是如果在某種程度上我們得到他們在單獨變量的位置。 – SumitArya

+0

獲取單獨的變量?時間值或會話ID?考慮一下,如果這可能是一個不同的職位。 – wibeasley

+0

其實我有一個計算頁面連接的公式,在這個公式中我使用了我們在會話中找到匹配的位置。這是另一篇文章。好,謝謝! – SumitArya