【R】「カテゴリごとに初めて○○した日」を抽出する方法

スポンサーリンク

データ分析において、「初めて○○した日を抽出したい」ということはよくあると思います。
例えば、ログファイルを解析していて、

  • 顧客が初めてアプリに課金した日
  • 顧客に初めてダイレクトメールを送付した日

などが上げられます。

実際のプロセス手順としては

  1. melt関数で日付をが縦長になるデータフレームにする(Reshape2パッケージ)
  2. 個人でグルーピングして、日付の最小値をサマライズ(dplyrパッケージ)

です。

まずはパネル型のデータを自作してみましょう。

#横長の時系列データ作成
date<-format(seq(as.Date("2014-01-01"), as.Date("2014-12-31"), by="month"),"%Y-%m")
x<-c(0,0,0,0,1,1,2,3,4)
a<-sample(x, length(date),replace=TRUE)  #ランダム復元抽出
b<-sample(x, length(date),replace=TRUE)
c<-sample(x, length(date),replace=TRUE)
d<-sample(x, length(date),replace=TRUE)
data<-rbind(a,b,c,d, deparse.level = 0)
data<-cbind(1:4,data)

#フィールド名を付ける
colnames(data)<-c("ID",date)
data<-as.data.frame(data)

#reshape2パッケージ導入
library(reshape2)
#meltで横長→縦長へ
data.melt<-melt(data, id="ID")
data.melt<-data.melt[order(data.melt$ID),]
names(data.melt)[2:3]<-c("Month","Payment")

# 一度日付フォーマットに直す(テキトーに1日をくっつける)
data.melt$Month<-paste(data.melt$Month,"1",sep="-")
data.melt$Month<-as.Date(data.melt$Month,origin="1970/1/1")

すると、こんな感じのデータができました。

#データ表示
data.melt

   ID      Month Payment
1 2014-01-01       1
1 2014-02-01       0
1 2014-03-01       0
1 2014-04-01       1
1 2014-05-01       1
1 2014-06-01       3
1 2014-07-01       0
1 2014-08-01       0
1 2014-09-01       0
1 2014-10-01       0
1 2014-11-01       0
1 2014-12-01       0
2 2014-01-01       0
2 2014-02-01       4
2 2014-03-01       0
2 2014-04-01       0
2 2014-05-01       0
2 2014-06-01       1
2 2014-07-01       3
2 2014-08-01       0
2 2014-09-01       0
2 2014-10-01       3
2 2014-11-01       1
2 2014-12-01       1
3 2014-01-01       0
3 2014-02-01       2
3 2014-03-01       0
3 2014-04-01       0
3 2014-05-01       1
3 2014-06-01       1
3 2014-07-01       0
3 2014-08-01       4
3 2014-09-01       1
3 2014-10-01       0
3 2014-11-01       1
3 2014-12-01       4
4 2014-01-01       4
4 2014-02-01       0
4 2014-03-01       3
4 2014-04-01       3
4 2014-05-01       0
4 2014-06-01       0
4 2014-07-01       0
4 2014-08-01       3
4 2014-09-01       3
4 2014-10-01       0
4 2014-11-01       0
4 2014-12-01       2

Paymentは課金した回数とします。

それでは、それぞれの人が2014年に初めて課金した日を求めてみましょう。
使用するパッケージはdplyrです。

#パッケージインストール
library(dplyr)
#最も早い支払いが発生月を抽出
data.dplyr<-data.melt%>%
  filter(Payment>0)%>%
  group_by(ID)%>%
  summarise(FirstMonthPaid=min(Month))

#先ほどテキトーにつけた1日を除去
data.dplyr$FirstMonthPaid<-format(data.dplyr$FirstMonthPaid,"%Y-%m")
#結果表示
data.dplyr

Source: local data frame [4 x 2]

ID FirstMonthPaid
 1        2014-01
 2        2014-02
 3        2014-02
 4        2014-01

こんな感じでカテゴリ(ID)ごとに初めて課金した日付を抽出することができました。

参考

dplyrの使い方は以下が参考になります。

dplyr入門

スポンサーリンク
スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です