我有一个超过200万行的大型数据框。每行包括个人付款和付款发生的月份。不同的人被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'变量,这些变量是指自付款开始以来经过的月数。然后我需要将其重新格式化为宽格式,以便每行引用一个单独的和新的列引用我使用以下代码实现此目的的'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行,我必须用超过200万行来完成。似乎特别缓慢的部分是生成具有不等数量的id的因子水平(这部分:mutate(monthonbooks = gl(nrow(df), 1, n(), labels = rep(1:nrow(df), ordered = TRUE)))
。有没有人知道生成不等因子水平的更快的替代方案?如果解决方案会特别好基于dplyr,或者可以在dplyr管道中实现的解决方案。
答案 0 :(得分:1)
您可以尝试使用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>