2017-10-31 5 views
-1

다음과 같은 데이터 집합이 있지만 훨씬 많은 참가자가 있습니다. 그냥 R에 다음 코드를 복사하여 붙여 넣기 :참가자가 R 약속으로 갔을 때의 시간을 고려하여 참가자 당 방문 횟수를 어떻게 얻을 수 있습니까?

d <- structure(list(id = c(33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L), VisitDate = c("10/12/14", "10/12/14", "10/13/14", "10/14/14", "11/7/14", "11/7/14", "11/8/12", "11/8/14", "11/9/12", "4/17/13", "5/29/15", "10/26/12", "10/29/12", "11/7/13", "2/15/17", "2/9/15", "3/6/17", "3/7/13", "4/8/16", "4/8/16", "7/28/14", "9/14/12", "9/18/15", "9/18/15"), VisitHours = c(13L, 15L, 10L, 11L, 10L, 9L, 13L, 11L, 11L, 22L, 9L, 16L, 14L, 10L, 11L, 10L, 9L, 14L, 13L, 14L, 13L, 10L, 10L, 14L)), .Names = c("id", "VisitDate", "VisitHours"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -24L), spec = structure(list(cols = structure(list(id = structure(list(), class = c("collector_integer", "collector")), VisitDate = structure(list(), class = c("collector_character", "collector")), VisitHours = structure(list(), class = c("collector_integer", "collector"))), .Names = c("id", "VisitDate", "VisitHours")), default = structure(list(), class = c("collector_guess", "collector"))), .Names = c("cols", "default"), class = "col_spec")) 

을 여기에 다른 약속이나 다른 날짜와 시간에 방문을했다 IDS (33)와 45 개의 참가자가 있습니다. 기본적으로 각 방문일은 방문일로 간주됩니다. 단, 같은 날의 방문시와 방문 시각의 차이가 3보다 큰 경우는 예외입니다. 3보다 작 으면 한 번의 방문으로 계산됩니다.

먼저 방문수를 계산하는 변수를 얻고 싶습니다. 예를 들어, 참가자 33의 경우 10/12/14 일에 두 번의 방문이 있었지만 서로 매우 가까웠습니다 (13 세 및 15 세, VisitHours 열 참조). 이러한 방문은 한 번 방문으로. 반면 참가자 45는 9/18/15에 두 번 방문했으며 서로 멀리 떨어져있었습니다 (10 번과 14 번, VisitHours 열 참조). 따라서이 방문수는 두 번 방문으로 계산됩니다. 같은 날 VisitHours의 차이는 같거나보다 큰 3.이 생겼 방법의 예로서 아래의 dataframe를 참조하기 때문에 같은 날에 : 끝에서

structure(list(id = c(33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L, 45L), VisitDate = c("10/12/14", "10/12/14", "10/13/14", "10/14/14", "11/7/14", "11/7/14", "11/8/12", "11/8/14", "11/9/12", "4/17/13", "5/29/15", "10/26/12", "10/29/12", "11/7/13", "2/15/17", "2/9/15", "3/6/17", "3/7/13", "4/8/16", "4/8/16", "7/28/14", "9/14/12", "9/18/15", "9/18/15"), VisitHours = c(13L, 15L, 10L, 11L, 10L, 9L, 13L, 11L, 11L, 22L, 9L, 16L, 14L, 10L, 11L, 10L, 9L, 14L, 13L, 14L, 13L, 10L, 10L, 14L), CountVisits = c(1L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L)), .Names = c("id", "VisitDate", "VisitHours", "CountVisits"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -24L), spec = structure(list(cols = structure(list(id = structure(list(), class = c("collector_integer", "collector")), VisitDate = structure(list(), class = c("collector_character", "collector")), VisitHours = structure(list(), class = c("collector_integer", "collector")), CountVisits = structure(list(), class = c("collector_integer", "collector"))), .Names = c("id", "VisitDate", "VisitHours", "CountVisits")), default = structure(list(), class = c("collector_guess", "collector"))), .Names = c("cols", "default"), class = "col_spec")) 

, 난 그냥 하나 개의 행을 원한다 각 참가자의 이전 방문수와 이전 데이터 프레임에서 계산 된 방문수의 합계 :

d1 <- structure(list(id = c(33L, 45L), CountAllVisits = c(8L, 12L)), .Names = c("id", "CountAllVisits"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -2L), spec = structure(list(cols = structure(list(id = structure(list(), class = c("collector_integer", "collector")), CountAllVisits = structure(list(), class = c("collector_integer", "collector"))), .Names = c("id", "CountAllVisits")), default = structure(list(), class = c("collector_guess", "collector"))), .Names = c("cols", "default"), class = "col_spec")) 

고맙습니다!

답변

0
library(tidyverse) 

d %>% 
    group_by(id, VisitDate) %>% 
    arrange(id, VisitDate, VisitHours) %>% 
    mutate(visit_diff = VisitHours - lag(VisitHours)) %>% 
    ungroup() %>% 
    # make NAs greater than 3 so they don't get dropped in next step 
    mutate(visit_diff = ifelse(is.na(visit_diff), 99999, visit_diff)) %>% 
    # drop all visits with difference < 3 hours 
    filter(visit_diff > 2) %>% 
    group_by(id) %>% 
    summarise(count = n())