3

data.tableユーザーID、居住国、イベントなどのイベントを記録しています。例えば、

dt <- data.table(user=c(rep(3, 5), rep(4, 5)),
                 country=c(rep(1,4),rep(2,6)),
                 event=1:10, key="user")

ご覧のとおり、データは多少破損しています。イベント 5 は、ユーザー 3 が国 2 にいると報告しています (または、彼は旅行した可能性があります。ここでは関係ありません)。したがって、データを要約しようとすると:

dt[, country[.N] , by=user]
   user V1
1:    3  2
2:    4  2

ユーザー 3 について間違った国を取得しました。理想的には、ユーザーの最も一般的な国と、そのユーザーがそこで過ごした時間の割合を取得したいと考えています。

   user country support
1:    3       1     0.8
2:    4       2     1.0

それ、どうやったら出来るの?

実際のデータには〜10 ^ 7行あるため、ソリューションをスケーリングする必要があります(これが、私が使用している理由であり、結局のところそうではdata.tableありません)。data.frame

4

2 に答える 2

7

別の方法:

編集しました。table(.)犯人でした。data.table完全な構文に変更しました。

dt.out<- dt[, .N, by=list(user,country)][, list(country[which.max(N)], 
               max(N)/sum(N)), by=user]
setnames(dt.out, c("V1", "V2"), c("country", "support"))
#    user country support
# 1:    3       1     0.8
# 2:    4       2     1.0
于 2013-04-24T20:00:44.100 に答える
4

plyrcount関数を使用する:

dt[, count(country), by = user][order(-freq),
                                list(country = x[1],
                                     support = freq[1]/sum(freq)),
                                by = user]
#   user country support
#1:    4       2     1.0
#2:    3       1     0.8

アイデアは、ユーザーごとに国を数え、最大頻度で並べ替えてから、好きなデータを取得することです。

余分な関数を使用しない@mnelのおかげで、よりスマートな答え:

dt[, list(freq = .N),
     by = list(user, country)][order(-freq),
                               list(country = country[1],
                                    support = freq[1]/sum(freq)),
                               by = user]
于 2013-04-24T19:53:44.200 に答える