원하는 내용이 아직 명확하지 않지만 (질문에 대한 의견 참조) 여기에 두 가지 접근 방법이 있습니다.
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의 이벤트가 몇 번이나 발생했는지에 대한 이벤트로 원하는 날짜를 계산하는 경우 조금 뒤로 물러 설 필요가 있습니다. 이를 위해서는 원하는 날짜로 각 그룹에 대한 행이있는 새 데이터 프레임을 생성해야합니다. 이것은 complete
을 tidyr
에서 쉽게 구할 수 있습니다. 그런 다음 해당 그룹에 대해 지난 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'표시를' 그러나 행 21과 행 5의 4 일 이내에 있었던 이벤트가 18 일에 있었지만 21 번 이벤트는 0으로 되돌아갔습니다. 귀하의 예가 데이터 표시 방법을 정확하게 묘사하고 있습니까? 마찬가지로 하루에 두 개의 항목이있는 경우 각각에 대해 행을 원하나요? 이벤트 수를 표시하는 대신'group1' 및'group2' 열을 유지하려는 이유가 있습니까? 여전히 각'group2' 하위 그룹에 대해 개별 카운트를하려고합니까? –
많은 것들이 우리에게 동기 부여의 예를 제시함으로써 대답 될 수 있습니다. 이전의 두 가지 질문, 특히 지금은 그것이 어떻게 사용될 것인지 명확하지 않기 때문에 원하는 결과가 무엇인지 명확하지 않습니다. –