2017-12-12 23 views
0

각 그룹 (그룹 2)의 기간 동안 이벤트 수 (그룹 1)를 수행했습니다. 그룹 1 이벤트를 별도의 열로 분산시키고 그룹 2와 타임 스탬프를 행으로 사용하려고합니다. 각 셀에는 일정 기간 동안의 이벤트 수가 포함됩니다 (현재 날짜에서 이전 4 일).시간 경과에 따른 이전 행 수를 기반으로 한 채우기 수/합계

그룹 2 (I & II) 각각에 대해 그룹 1의 이벤트 A 및 L을 4 일 이내에 계산 한 각각에 대해 아래 예제를 참조하십시오.

dates = as.Date(c("2011-10-09", 
    "2011-10-15", 
    "2011-10-16", 
    "2011-10-18", 
    "2011-10-21", 
    "2011-10-22", 
    "2011-10-24")) 
group1=c("A", 
    "A", 
    "A", 
    "A", 
    "L", 
    "L", 
    "A") 
group2=c("I", 
    "I", 
    "I", 
    "I", 
    "I", 
    "I", 
    "II") 

df1 <- data.frame(dates, group1, group2) 

사용 dplyr 파이프 나는 & L은에 따라 업데이 트를 계산

df1 %>% 
    group_by(group1, group2) %>% 
    mutate(count = sapply(dates 
        , function(x){ 
         sum(dates <= x & dates > (x-4)) 
         })) 


    dates group1 group2 count 
    <date> <fctr> <fctr> <int> 
1 2011-10-09  A  I  1 
2 2011-10-15  A  I  1 
3 2011-10-16  A  I  2 
4 2011-10-18  A  I  3 
5 2011-10-21  L  I  1 
6 2011-10-22  L  I  2 
7 2011-10-24  A  II  1 

는 결국, 나는 이벤트와 함께이 비슷한 표를 얻으려는 (또한 Count event types over time series by multiple conditions 참조) 다음 표를 생성하는 관리 I & II (그룹 2)에서 날짜 (기간 = 현재 날짜 - 4 일). 더 큰 데이터 세트에서

  dates group1 group2 count (A) count (L) 
    1 2011-10-09  A  I  1   0 
    2 2011-10-15  A  I  1   0 
    3 2011-10-16  A  I  2   0 
    4 2011-10-18  A  I  3   0 
    5 2011-10-21  L  I  0   1 
    6 2011-10-22  L  I  0   2 
    7 2011-10-24  A  II  1   0 

은하지 그룹 1의 모든 이벤트는 모든 그룹에 나타납니다 2.이 중 1) 이전 행에서 앞으로 수를 휴대하거나 있도록 내가이 빈 셀을 업데이트 할 수있는 방법 2) 업데이트 된 타임 스탬프/시간대에 따라 카운트를 업데이트 하시겠습니까?

감사합니다.

+0

, 당신이 '0'표시를' 그러나 행 21과 행 5의 4 일 이내에 있었던 이벤트가 18 일에 있었지만 21 번 이벤트는 0으로 되돌아갔습니다. 귀하의 예가 데이터 표시 방법을 정확하게 묘사하고 있습니까? 마찬가지로 하루에 두 개의 항목이있는 경우 각각에 대해 행을 원하나요? 이벤트 수를 표시하는 대신'group1' 및'group2' 열을 유지하려는 이유가 있습니까? 여전히 각'group2' 하위 그룹에 대해 개별 카운트를하려고합니까? –

+0

많은 것들이 우리에게 동기 부여의 예를 제시함으로써 대답 될 수 있습니다. 이전의 두 가지 질문, 특히 지금은 그것이 어떻게 사용될 것인지 명확하지 않기 때문에 원하는 결과가 무엇인지 명확하지 않습니다. –

답변

0

원하는 내용이 아직 명확하지 않지만 (질문에 대한 의견 참조) 여기에 두 가지 접근 방법이 있습니다.

count 열을 웬만한 이유로 흩어져서 0으로 채우고 (지난 4 일 동안의 이벤트가 있었는지의 여부와 상관없이) group2 고장으로 여전히 계산됩니다. 당신은 단지 group1으로 라벨을 붙이고 있습니다) 당신의 질문에 당신의 예처럼 장소에 이벤트 정보를 남겨두면, 원하는 라벨을 가진 열을 만들 수 있습니다. 그런 다음 spread을 사용하여 새로운 열을 만듭니다. 이

df1 %>% 
    group_by(group1, group2) %>% 
    mutate(count = sapply(dates 
         , function(x){ 
          sum(dates <= x & dates > (x-4)) 
         })) %>% 
    ungroup() %>% 
    mutate(toSpread = paste0("Count (", group1, ")")) %>% 
    spread(toSpread, count, fill = 0) 

반환이 :

당신이 당신의 질문에 표시 한 출력과 일치하는
 dates group1 group2 `Count (A)` `Count (L)` 
*  <date> <fctr> <fctr>  <dbl>  <dbl> 
1 2011-10-09  A  I   1   0 
2 2011-10-15  A  I   1   0 
3 2011-10-16  A  I   2   0 
4 2011-10-18  A  I   3   0 
5 2011-10-21  L  I   0   1 
6 2011-10-22  L  I   0   2 
7 2011-10-24  A  II   1   0 

. 그러나 각 그룹 1의 이벤트가 몇 번이나 발생했는지에 대한 이벤트로 원하는 날짜를 계산하는 경우 조금 뒤로 물러 설 필요가 있습니다. 이를 위해서는 원하는 날짜로 각 그룹에 대한 행이있는 새 데이터 프레임을 생성해야합니다. 이것은 completetidyr에서 쉽게 구할 수 있습니다. 그런 다음 해당 그룹에 대해 지난 4 일 동안 발생한 이벤트에 대해 각각을 확인할 수 있습니다.

df1 %>% 
    select(dates, group1) %>% 
    complete(dates, group1) %>% 
    mutate(count = sapply(1:n() 
         , function(idx){ 
          sum(df1$dates <= dates[idx] & 
           df1$dates > (dates[idx]-4) & 
           df1$group1 == group1[idx]) 
         })) %>% 
    mutate(group1 = paste0("Count (", group1, ")")) %>% 
    spread(group1, count, fill = 0) 

반환 :

# A tibble: 7 x 3 
     dates `Count (A)` `Count (L)` 
*  <date>  <dbl>  <dbl> 
1 2011-10-09   1   0 
2 2011-10-15   1   0 
3 2011-10-16   2   0 
4 2011-10-18   3   0 
5 2011-10-21   1   1 
6 2011-10-22   0   2 
7 2011-10-24   1   2 

주 더 이벤트가 없었다되는 일을 포함 할 경우, 당신은 날짜를 전달하여 당신이 complete에 체크인 원하는 것을 할 수 있습니다.

df1 %>% 
    select(dates, group1) %>% 
    complete(dates = full_seq(dates, 1), group1) %>% 
    mutate(count = sapply(1:n() 
         , function(idx){ 
          sum(df1$dates <= dates[idx] & 
           df1$dates > (dates[idx]-4) & 
           df1$group1 == group1[idx]) 
         })) %>% 
    mutate(group1 = paste0("Count (", group1, ")")) %>% 
    spread(group1, count, fill = 0) 

반환 : 예를 들어

 dates `Count (A)` `Count (L)` 
*  <date>  <dbl>  <dbl> 
1 2011-10-09   1   0 
2 2011-10-10   1   0 
3 2011-10-11   1   0 
4 2011-10-12   1   0 
5 2011-10-13   0   0 
6 2011-10-14   0   0 
7 2011-10-15   1   0 
8 2011-10-16   2   0 
9 2011-10-17   2   0 
10 2011-10-18   3   0 
11 2011-10-19   2   0 
12 2011-10-20   1   0 
13 2011-10-21   1   1 
14 2011-10-22   0   2 
15 2011-10-23   0   2 
16 2011-10-24   1   2 

의견을 바탕으로, 나는 마침내 목표를 이해하고 생각합니다.

fullDateCounts <- 
    df1 %>% 
    select(dates, group1, group2) %>% 
    complete(dates = full_seq(dates, 1), group1, group2) %>% 
    mutate(count = sapply(1:n() 
         , function(idx){ 
          sum(df1$dates <= dates[idx] & 
           df1$dates > (dates[idx]-4) & 
           df1$group1 == group1[idx] & 
           df1$group2 == group2[idx] 
          ) 
         })) 

이의 상단은 다음과 같습니다 :

 dates group1 group2 count 
     <date> <fctr> <fctr> <int> 
1 2011-10-09  A  I  1 
2 2011-10-09  A  II  0 
3 2011-10-09  L  I  0 
4 2011-10-09  L  II  0 
5 2011-10-10  A  I  1 
6 2011-10-10  A  II  0 
7 2011-10-10  L  I  0 
8 2011-10-10  L  II  0 
9 2011-10-11  A  I  1 
10 2011-10-11  A  II  0 
# ... with 54 more rows 
첫째, 모든 날짜에 대한 각 그룹 1/그룹 2 쌍의 개수와 "긴"데이터 프레임을 생성, 위와 같이하여 시작할 것 당신이 정말로 다양한 형태로 변환해야하는 경우 (당신이 열 이름을 전환하는 경우, 또는 그룹 1)

거기에서, 당신은 각 그룹 2에 대한 행과 그렇게 할 수 있습니다 :

fullDateCounts %>% 
    mutate(group1 = paste0("Count (", group1, ")")) %>% 
    spread(group1, count, fill = 0) 

반환 :

,451,515,
 dates group2 `Count (A)` `Count (L)` 
*  <date> <fctr>  <dbl>  <dbl> 
1 2011-10-09  I   1   0 
2 2011-10-09  II   0   0 
3 2011-10-10  I   1   0 
4 2011-10-10  II   0   0 
5 2011-10-11  I   1   0 
6 2011-10-11  II   0   0 
7 2011-10-12  I   1   0 
8 2011-10-12  II   0   0 
9 2011-10-13  I   0   0 
10 2011-10-13  II   0   0 
# ... with 22 more rows 

또는 당신이 각 그룹 1/그룹 2 쌍의 열을 생성 할 수 있습니다 : 수 (A)`에 대한

fullDateCounts %>% 
    mutate(toSpread = paste0("Count (", group1, "-", group2, ")")) %>% 
    select(-group1, -group2) %>% 
    spread(toSpread, count, fill = 0) 

반환 당신의 예에서

 dates `Count (A-I)` `Count (A-II)` `Count (L-I)` `Count (L-II)` 
*  <date>   <dbl>   <dbl>   <dbl>   <dbl> 
1 2011-10-09    1    0    0    0 
2 2011-10-10    1    0    0    0 
3 2011-10-11    1    0    0    0 
4 2011-10-12    1    0    0    0 
5 2011-10-13    0    0    0    0 
6 2011-10-14    0    0    0    0 
7 2011-10-15    1    0    0    0 
8 2011-10-16    2    0    0    0 
9 2011-10-17    2    0    0    0 
10 2011-10-18    3    0    0    0 
11 2011-10-19    2    0    0    0 
12 2011-10-20    1    0    0    0 
13 2011-10-21    1    0    1    0 
14 2011-10-22    0    0    2    0 
15 2011-10-23    0    0    2    0 
16 2011-10-24    0    1    2    0 
+0

실제로 5 행과 6 행의 수 (A)는 1과 0이어야합니다. 여기서 수는 모든 그룹 2에서 계산됩니다. 이것을 강조해 주셔서 감사합니다. 날짜를 넣으면 그룹 1과 그룹 2가 문맥에옵니다. 내 데이터 세트에서 그룹 2는 연구의 참가자 ID를 나타내며 그룹 1 하위 범주는 각 참가자에게 기록되는 이벤트를 나타냅니다. 날짜 열은 그룹 1의 이벤트가 발생했음을 나타냅니다. 모든 참가자 (그룹 2)가 그룹 1에서 측정 된 이벤트/하위 카테고리를보고 한 것은 아닙니다. – cyb

+0

이 테이블을 만들면 각 그룹 1 이벤트 날짜에 각 참가자 (그룹 2 하위 카테고리)가 X 이벤트 A, Y 번호 4 일간의 이벤트 L 등등. 그래, 나는 여전히 각 그룹 2 하위 그룹에 대한 별도의 카운트를 시도하고있다. 이러한 솔루션을 제안 해 주셔서 감사합니다. 나는 select (dates, group1, group2) 및 group_by (group2)를 dplyr 파이프에 추가하여 답변을 업데이트해야한다고 생각하십니까? – cyb

+0

방금 ​​편집 한 내용이 귀하의 필요를 해결했다고 생각합니다. 앞으로는 성취하려는 대상을 명확히하기 위해 설명 라벨 (예 : 이벤트 및 참가자)을 사용하는 것이 좋습니다. –