1

私は R 初心者であり、その ID のタイプ「B」のイベント間で発生した各 ID のイベント タイプの数を合計するデータセットで要約を実行しようとしています。説明するサンプルを次に示します。

id <- c('1', '1', '1', '2', '2', '2', '3', '3', '3', '3')
type <- c('A', 'A', 'B', 'A', 'B', 'C', 'A', 'B', 'C', 'B')
datestamp <- as.Date(c('2016-06-20','2016-07-16','2016-08-14','2016-07-17'
                       ,'2016-07-18','2016-07-19','2016-07-16','2016-07-19'
                       , '2016-07-21','2016-08-20'))
df <- data.frame(id, type, datestamp)

これは以下を生成します:

> df
   id type  datestamp
1   1    A 2016-06-20
2   1    A 2016-07-16
3   1    B 2016-08-14
4   2    A 2016-07-17
5   2    B 2016-07-18
6   2    C 2016-07-19
7   3    A 2016-07-16
8   3    B 2016-07-19
9   3    C 2016-07-21
10  3    B 2016-08-20

イベント「B」が発生するたびに、その B イベントの前に発生した各イベント タイプの数を知りたいのですが、その ID の他の B イベントの後に発生しました。私が最終的にやりたいのは、次のようなテーブルです。

  id type B_instance count
1  1    A          1     2
2  2    A          1     1
3  3    A          1     1
4  3    C          2     1

調査中、この質問は最も近いものでした: dplyr の別のフィールドの値に基づいてフィールドを要約する

私はこの仕事をしようとしてきました:

  df2 <- df %>%
  group_by(id, type) %>%
  summarize(count = count(id[which(datestamp < datestamp[type =='B'])])) %>%
  filter(type != 'B')

しかし、それはエラーになります (また、うまくいったとしても、id=3 のように、同じ ID で 2 つの「B」イベントを考慮していません)。

4

2 に答える 2

1

を使用したオプションを次に示しますdata.table。「data.frame」を「data.table」に変換します ( 、「id」でグループ化され、「type」が「B」でsetDT(df)ある位置のシーケンスを取得し、行インデックスを見つけ ( )、その列を抽出します ( ) . 次に、データセット ( ) をサブセット化し、「type」が「B」である行を削除し、「id」、「type」、および「type」でグループ化して、行数を「count」として取得します。max.I$V1df[i1]rleid

library(data.table)
i1 <- setDT(df)[, .I[seq(max(which(type=="B")))] , by = id]$V1
df[i1][type!="B"][,  .(count = .N), .(id, type, B_instance = rleid(type))]
#   id type B_instance count
#1:  1    A        1     2
#2:  2    A        1     1
#3:  3    A        1     1
#4:  3    C        2     1
于 2016-08-23T19:22:10.447 に答える