R: более быстрая альтернатива для генерирования неравных уровней факторов - PullRequest
0 голосов
/ 26 апреля 2018

У меня большой массив данных, содержащий более 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.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете попробовать Tidyverse без решения Reshape2

library(tidyverse)
df %>% 
  arrange(id, snapshot_at) %>% 
  group_by(id) %>% 
  mutate(monthonbooks=1:n()) %>%
  select(-snapshot_at) %>% 
  spread(monthonbooks, category) 
# A tibble: 2 x 15
# Groups:   id [2]
     id `1`   `2`   `3`   `4`   `5`   `6`   `7`   `8`   `9`   `10`  `11`  `12` 
  <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1     1 C     D     D     D     D     D     D     D     D     D     D     D    
2    10 A     A     A     A     A     B     NA    NA    NA    NA    NA    NA   
# ... with 2 more variables: `13` <chr>, `14` <chr>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...