[R] Help me replace a for loop with an "apply" function

gd047 gd047 at mineknowledge.com
Thu Oct 1 17:29:09 CEST 2009


...if that is possible 

My task is to find the longest streak of continuous days a user participated
in a game. 

Instead of writing an sql function, I chose to use the R's rle function, to
get the longest streaks and then update my db table with the results.

The (attached) dataframe is something like this:

    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



--- R code follows
------------------------------------------------------


# 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)))
}


----------------------------------------------------
--- end of R code

Unfortunately this for loop takes too long and I' wondering if there is a
way to produce the res matrix using a function from the "apply" family.

Thank you in advance
-- 
View this message in context: http://www.nabble.com/Help-me-replace-a-for-loop-with-an-%22apply%22-function-tp25696937p25696937.html
Sent from the R help mailing list archive at Nabble.com.




More information about the R-help mailing list