... si cela est possibleAidez-moi pour remplacer une boucle avec une fonction « apply »
Ma tâche est de trouver la plus longue série de jours consécutifs un utilisateur ont participé à un jeu. Au lieu d'écrire une fonction sql, j'ai choisi d'utiliser la fonction r de R, pour obtenir les plus longues séquences, puis mettre à jour ma table db avec les résultats.
Le (ci-joint) dataframe est quelque chose comme ceci:
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
J'ai essayé ce qui suit pour obtenir par la plus longue séquence utilisateur
# 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)))
}
Malheureusement, cette boucle est trop long et je me demandais si il existe un moyen de produire la matrice res en utilisant une fonction de la famille "apply".
Nous vous remercions à l'avance
Si vous voulez faire en sql (ou avec sqldf en R), il y a une excellente discussion dans cette autre thread SO http://stackoverflow.com/questions/1176011/sql-to-determine-minimum-sequential-days-of-access/1176255#1176255 –
Pourquoi utilisez-vous ce schéma de collage/d'évaluation? Il semble que cela va vous donner un énorme coup de performance? –
Je suis d'accord avec Jonathan; et cela rend aussi très difficile à lire. Est-ce ce que vous essayez de faire? res.1 <-matrice (nrow = dim (ma.table) [1], ncol = 2) pour (i dans 1: dim (ma.table) [1]) { res.1 [i, ] <- c (as.integer (nom de la table (my.table) [i]), somme (as.table (table.mon) [i,])) } – Vince