......如果可能的話幫我用一個「應用」函數替換一個for循環
我的任務是找到用戶參與遊戲的最長連續日子。
我選擇使用R的rle函數來獲取最長的條紋,然後用結果更新我的數據庫表,而不是編寫一個sql函數。
的(附後)據幀是這樣的:
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循環的時間太長而我想,如果有一種方法可以使用「應用」系列中的函數生成res矩陣。
預先感謝您
如果你要在SQL中做(或R中sqldf)有這等一個很好的討論,讓線程的http:/ /stackoverflow.com/questions/1176011/sql-to-determine-minimum-sequential-days-of-access/1176255#1176255 – 2009-10-01 16:25:29
你爲什麼使用該粘貼/評估計劃?看起來這會給你帶來巨大的性能打擊? – 2009-10-01 16:53:23
我同意喬納森;這也使得它很難閱讀。那是你想要做什麼? res.1 <-matrix(nrow = dim(my.table)[1],ncol = 2) for(i in 1:dim(my.table)[1]){ ] < - c(as.integer(rownames(my.table)[i]),sum(as.table(my.table)[i,]))} – Vince 2009-10-01 17:44:26