2017-08-21 4 views
2

library(dplyr)を使用して、以前に発生した値の出現を数えたいと思います。IDで前回のIDを日付別に数える方法は?

例データ:

それは、過去に発生した場合、私はIDに1を追加
  dates ID  prev_occurene 
    1 2011-01-13 1    1 
    2 2011-01-14 2    1 
    3 2011-01-15 3    1 
    4 2011-01-16 3    2 
    5 2011-01-17 1    2 
    6 2011-01-13 5    1 
    7 2011-01-14 6    1 
    8 2011-01-15 5    2 
    9 2011-01-16 7    1 
    10 2011-01-17 8    1 
    11 2011-01-13 1    3 
    12 2011-01-14 2    2 
    13 2011-01-15 11    1 
    14 2011-01-16 2    3 
    15 2011-01-17 12    1 
    16 2011-01-17 5    3 
    17 2011-01-17 5    4 
    18 2011-01-18 1    4 
    19 2011-01-18 4    1 

dates <- as.Date(as.character(c("2011-01-13", 
            "2011-01-14", 
            "2011-01-15", 
            "2011-01-16", 
            "2011-01-17", 
            "2011-01-13", 
            "2011-01-14", 
            "2011-01-15", 
            "2011-01-16", 
            "2011-01-17", 
            "2011-01-13", 
            "2011-01-14", 
            "2011-01-15", 
            "2011-01-16", 
            "2011-01-17", 
            "2011-01-17", 
            "2011-01-17", 
            "2011-01-18", 
            "2011-01-18"))) 

    ID <-c("1","2","3","3","1","5","6","5","7","8","1","2","11","2",'12',"5","5","1","4") 
    # put together 
    data <- data.frame(dates,ID) 
    data 

     dates  ID 
    1 2011-01-13 1 
    2 2011-01-14 2 
    3 2011-01-15 3 
    4 2011-01-16 3 
    5 2011-01-17 1 
    6 2011-01-13 5 
    7 2011-01-14 6 
    8 2011-01-15 5 
    9 2011-01-16 7 
    10 2011-01-17 8 
    11 2011-01-13 1 
    12 2011-01-14 2 
    13 2011-01-15 11 
    14 2011-01-16 2 
    15 2011-01-17 12 
    16 2011-01-17 5 
    17 2011-01-17 5 
    18 2011-01-18 1 
    19 2011-01-18 4 

私は次のようになり、データセットを構築したいと思います。

これまでは重複を使用して解決しようとしました。ただし、出力は非常に有望に見えるdoesntの:dplyr

library(dplyr) 

data_dups <- data %>% 
    group_by(dates) %>% 
    mutate(dups = duplicated(ID)) %>% 
    filter(dups == 'TRUE') %>% 
    summarise(occurence = n()) 

      dates occurence 

     <date>   <int> 
     1 2011-01-13   1 
     2 2011-01-14   1 
     3 2011-01-17   1 
+2

dplyr::row_number() 'AVE(seq_along(データ$ ID)、データ$ ID、FUN = seq_along)を使用してこれを試してみてください' –

+0

イムは、申し訳ありませんが、私はちょうど私がの順序をregadringミスを犯す実現します時系列 – Mamba

+0

@ d.bという編集を行うだけです。出力はまさにそのようになります。ありがとうございました!それを 'dplyr'パイプとmutateステートメントに統合することは可能でしょうか? – Mamba

答えて

2

をあなたは、グループ内の発生をカウントするためにrow_number()を使用することができます。

library(tidyverse) 
data %>% 
    arrange(dates) %>% 
    group_by(ID) %>% 
    mutate(occurrence = row_number()) 

# A tibble: 19 x 3 
# Groups: ID [10] 
#   dates  ID occurrence 
#   <date> <fctr>  <int> 
# 1 2011-01-13  1   1 
# 2 2011-01-14  2   1 
# 3 2011-01-15  3   1 
# 4 2011-01-16  3   2 
# 5 2011-01-17  1   2 
# 6 2011-01-13  5   1 
# 7 2011-01-14  6   1 
# 8 2011-01-15  5   2 
# 9 2011-01-16  7   1 
# 10 2011-01-17  8   1 
# 11 2011-01-13  1   3 
# 12 2011-01-14  2   2 
# 13 2011-01-15  11   1 
# 14 2011-01-16  2   3 
# 15 2011-01-17  12   1 
# 16 2011-01-17  5   3 
# 17 2011-01-17  5   4 
# 18 2011-01-18  1   4 
# 19 2011-01-18  4   1 

このソリューションは、datesで注文されたデータに依存します。従って、arrange(dates)が加えられる。

0

data %>% group_by(dates) %>% mutate(occurrence = row_number()) 
関連する問題