У меня большой массив данных, содержащий более 2 миллионов строк.Каждая строка состоит из платежа, сделанного физическим лицом, и месяца, в который был произведен этот платеж.разные люди индексируются по их id
, а у некоторых людей больше месяцев погашения, чем у других.Вот пример данных:
df <- structure(list(id = c(1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,
1L,1L,1L,1L,10L,10L,10L,10L,10L,10L), snapshot_at = c("2012-01-31",
"2012-02-29", "2012-03-31", "2012-04-30", "2012-05-31", "2012-06-30",
"2012-07-31", "2012-08-31", "2012-09-30", "2012-10-31", "2012-11-30",
"2012-12-31", "2013-01-31", "2013-02-28", "2012-01-31", "2012-02-29",
"2012-03-31", "2012-04-30", "2012-05-31", "2012-06-30"),
category = c("C","D","D","D","D","D","D","D","D","D","D","D","D","E",
"A","A","A","A","A","B")), class = "data.frame", .Names = c("id",
"snapshot_at", "category"), row.names = c(NA, -20L))
Мне нужно назначить переменные 'monthonbooks', которые относятся к числу месяцев, прошедших с начала платежей.Затем мне нужно преобразовать это в широкий формат, чтобы каждая строка ссылалась на отдельного человека, а новые столбцы ссылались на «месячные книги». Я добился этого с помощью следующего кода:
library(tidyverse)
library(reshape2)
df_wide <- df %>% arrange(id, snapshot_at) %>% group_by(id) %>%
mutate(monthonbooks = gl(nrow(df), 1, n(), labels = rep(1:nrow(df), ordered = TRUE))) %>%
dcast(id ~ monthonbooks, value.var = 'category')
Однако это невероятно медленнозапустить.У меня ушло около 5 минут, чтобы обработать 15000 строк, и мне нужно сделать это с более чем 2 миллионами строк.Кажется, что особенно медленная часть заключается в генерации уровней факторов с неодинаковыми числами id (эта часть: mutate(monthonbooks = gl(nrow(df), 1, n(), labels = rep(1:nrow(df), ordered = TRUE)))
. Кто-нибудь знает более быструю альтернативу для генерации неравных уровней факторов? Было бы особенно здорово, если бы решение основывалосьв dplyr, или решение, которое может быть реализовано в конвейере dplyr.