私はこれは私が実行したクエリ(私が働いているウェブサイトは、それが設定されていませんので、ノートこのケースでは、私はdimension1
を使用していない)で、RGoogleAnalytics
ライブラリを使用しています:
query.coll.d <- Init(start.date=start_date.d,
end.date=end_date.d,
dimensions=c("ga:date",
"ga:hour",
"ga:minute",
"ga:sourceMedium",
"ga:pagePath",
"ga:previousPagePath",
"ga:sessionDurationBucket"),
metrics=c("ga:sessions",
"ga:pageviews",
"ga:newUsers"),
table.id="ga:XXX view id XXX",
sort="-ga:date,-ga:hour,-ga:minute",
max.results = 20000)
ga.query.d <- QueryBuilder(query.coll.d)
ga.data.coll.d <- GetReportData(ga.query.d, token, paginate_query=TRUE)
フリー、私はタイムスタンプを(GA秒を提供しないことに注意してください)構築mは、
require(chron)
ga.data.coll.d$datetime <- chron(ga.data.coll.d$date, paste(ga.data.coll.d$hour,
ga.data.coll.d$minute,
'00',
sep=":"),
format=c("ymd","h:m:s"))
これは私が私の関数の中、後でそれを使用することができるように、グローバル変数を使用して、独自のはuserIdを作成するための機能です。
userId <- 1
getNewId <- function() {
current <- get("userId", envir = .GlobalEnv)
current <- current + 1
assign("userId", current, envir = .GlobalEnv)
return(current)
}
これは私がsessionDurationBucket
は整数Iは、上記の説明しようとしたアルゴリズムに応じて、グループの結果を処理する関数であり、datetimes
とsessions
はセッションのタイムスタンプのリストでありますグループ化する。
one_minute <- 1/(60*24)
setUserId <- function(datetimes, sessions, sessionDurationBucket) {
if (length(datetimes) == 1) {
# just one row received
return(getNewId())
}
if (sum(sessions) == 1) {
# just one session, all rows belong to the same user
return(getNewId())
}
users <- rep(NA, length(datetimes))
if (sessionDurationBucket == 0) {
# sessions of 1 page and length 0 => assign a user per session
for (i in 1:length(datetimes)) {
users[i] <- getNewId()
}
return(users)
}
# general case
minutes <- ceiling(as.numeric(sessionDurationBucket)/60) + 1
i <- 1
while(TRUE) {
index_lag <- (datetimes >= datetimes[i] - minutes*one_minute) & is.na(users)
sessions_lag <- sum(sessions[index_lag])
if (sessions_lag == 1) {
users[index_lag] <- getNewId()
} else {
# two or more sessions mixed together
users[index_lag] <- 0
}
# look for remaining users (without id yet)
rem_users <- which(is.na(users))
if (length(rem_users) == 0) {
break
}
i <- min(rem_users)
}
return(users)
}
そして、私は(あなたのケースでは、あなたがして、グループ内のdimension1
代わりのsourceMedium
を使用できることに注意)でグループを実行して新しい列を作成するためのdata.table
を使用しています。また、レジスタは日付によって逆順に並べ替えられているものとみなされます。これは、GAクエリで行われます。
require(data.table)
ga.data.coll.dt <- data.table(ga.data.coll.d)
ga.data.coll.dt[, userId:=setUserId(datetime, sessions, sessionDurationBucket), by=list(sessionDurationBucket, sourceMedium)]
それらのために上記のコードは、セッションを解決できませんでしたので、最後に私は、0に等しいuserId
を持っているすべてのレジスタを削除します。私の場合、無視できる数です。
実際には私の謙虚なブログにいくつかの説明を含めて投稿を予定していますが、月末までにはできません。
ありがとうございました、Irnzcig、 'ga:sessionDurationBucket'は行く方法のようです。私はPythonを使用していますが、私はRに最も慣れていますので、どのRコードでも大いに役立ちます。 –
更新されました。希望はそれが便利です! – lrnzcig