2017-12-12 9 views
0

私は、各グループ(グループ2)の期間にわたって(グループ1の)イベントのカウントを実行しました。グループ1のイベントを別の列に広げ、グループ2とタイムスタンプを行として使用することを検討しています。各セルには、一定期間(現在の日付から過去4日間)のイベントのカウントが含まれます。時系列上の前回の行数に基づく塗りつぶしカウント/合計

グループ2(I & II)のそれぞれについて、グループ1のイベントAおよびLを4日以内にカウントした場合の例を参照してください。

私は、次の表を作成するために管理dplyrパイプ(も Count event types over time series by multiple conditionsを参照してください)

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 

イベント& Lはに従ってアップデートをカウントして最終的に、私は、このような表を取得したいを使用し

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) 

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

、あなたは '数(A) 'のために' 0 'を示し、しかし、21日(行5)の4日以内に1つのイベント(18日に)がありましたが、21日にカウントが「0」に戻るはずです。あなたの例は、データの表示方法を正確に表していますか?同様に、1日に2つのエントリがある場合、それぞれの行が必要ですか?イベントカウントを表示するのではなく、 'group1'と' group2'カラムを保持したい理由はありますか?まだ 'group2'サブグループごとに別々のカウントをしようとしていますか? –

+0

多くのことが私たちに動機付けの例を与えて答えられるかもしれません。以前の2つの質問のそれぞれと、特に今、それがどのように使用されるのかが不明であるため、望ましい結果が何であるかは不明です。 –

答えて

0

あなたが望むものはまだ不明ですが(質問のコメントを参照)、ここに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の出来事がどれだけ発生したかという事象を伴う任意の日のカウントであれば、少し前に戻る必要があります。そのためには、必要な日付の新しいデータフレームを生成する必要があります。各データフレームには、各グループの行があります。これは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 

コメントに基づいて、私は私が最終的に目標を理解していと思います。まず、私はすべての日付の各グループ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 
+0

実際に行5と6のカウント(A)は1と0でなければなりません。カウントはすべてのグループ2で計算されます。これを強調してくれてありがとう。 日付を入力すると、グループ1とグループ2がコンテキストになります。私のデータセットでは、グループ2は研究の参加者IDを参照し、グループ1のサブカテゴリは各参加者に記録されたイベントを参照します。日付列は、グループ1からのイベントがそれぞれ発生したことを示します。すべての参加者(グループ2)がグループ1で測定されたイベント/サブカテゴリを報告しているわけではありません。 – cyb

+0

このテーブルを作成すると、各グループ1のイベント日に、各参加者(グループ2のサブカテゴリ)がイベントAのX番号、私はまだ各グループ2のサブグループごとに別々のカウントをしようとしています。 これらのソリューションをご提案いただきありがとうございます。回答を更新するには、select(dates、group1、group2)とgroup_by(group2)をdplyrパイプに追加する必要があると思いますか? – cyb

+0

私はちょうど編集があなたの必要性に対処したと思います。将来的には、あなたが達成しようとしていることを明確にするために説明ラベル(イベントや参加者など)を使用することをお勧めします。 –

関連する問題