【发布时间】:2010-12-03 01:17:31
【问题描述】:
...如果可能的话
我的任务是找出用户连续参与游戏的最长连续天数。
我没有编写 sql 函数,而是选择使用 R 的 rle 函数来获取最长的条纹,然后用结果更新我的 db 表。
(附加的)数据框是这样的:
day user_id
2008/11/01 2001
2008/11/01 2002
2008/11/01 2003
2008/11/01 2004
2008/11/01 2005
2008/11/02 2001
2008/11/02 2005
2008/11/03 2001
2008/11/03 2003
2008/11/03 2004
2008/11/03 2005
2008/11/04 2001
2008/11/04 2003
2008/11/04 2004
2008/11/04 2005
我尝试了以下方法来获得每个用户最长的连胜记录
# turn it to a contingency table
my_table <- table(user_id, day)
# get the streaks
rle_table <- apply(my_table,1,rle)
# verify the longest streak of "1"s for user 2001
# as.vector(tapply(rle_table$'2001'$lengths, rle_table$'2001'$values, max)["1"])
# loop to get the results
# initiate results matrix
res<-matrix(nrow=dim(my_table)[1], ncol=2)
for (i in 1:dim(my_table)[1]) {
string <- paste("as.vector(tapply(rle_table$'", rownames(my_table)[i], "'$lengths, rle_table$'", rownames(my_table)[i], "'$values, max)['1'])", sep="")
res[i,]<-c(as.integer(rownames(my_table)[i]) , eval(parse(text=string)))
}
不幸的是,这个 for 循环耗时太长,我想知道是否有一种方法可以使用“apply”系列中的函数生成 res 矩阵。
提前谢谢你
【问题讨论】:
-
如果你想在 sql 中做(或在 R 中使用 sqldf)有一个很好的讨论在这个其他 SO 线程 stackoverflow.com/questions/1176011/…
-
你为什么使用那个粘贴/评估方案?似乎这会给您带来巨大的性能影响?
-
我同意乔纳森的观点;这也使它很难阅读。那是你想要做的吗? res.1
-
发布一个可重现的示例,以便我们比较时间并贡献更好的代码怎么样?
-
应该这个 rle_table