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 回答