あなたが望むものはまだ不明ですが(質問のコメントを参照)、ここに2つのアプローチがあります。
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
コメントに基づいて、私は私が最終的に目標を理解していと思います。まず、私はすべての日付の各グループ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の行で行うことができ、次のいずれか
戻ります:
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組の列を生成することができます:あなたの例では
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
、あなたは '数(A) 'のために' 0 'を示し、しかし、21日(行5)の4日以内に1つのイベント(18日に)がありましたが、21日にカウントが「0」に戻るはずです。あなたの例は、データの表示方法を正確に表していますか?同様に、1日に2つのエントリがある場合、それぞれの行が必要ですか?イベントカウントを表示するのではなく、 'group1'と' group2'カラムを保持したい理由はありますか?まだ 'group2'サブグループごとに別々のカウントをしようとしていますか? –
多くのことが私たちに動機付けの例を与えて答えられるかもしれません。以前の2つの質問のそれぞれと、特に今、それがどのように使用されるのかが不明であるため、望ましい結果が何であるかは不明です。 –