... если это возможно
Моя задача - найти самую длинную серию непрерывных дней, в которых пользователь участвовал в игре.
Вместо того чтобы писать функцию sql, я решил использовать функцию rle R, чтобы получить самые длинные полосы, а затем обновить свою таблицу БД с результатами.
(прикрепленный) фрейм данных выглядит примерно так:
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 с использованием функции из семейства "apply".
Заранее спасибо