dplyr - 变异 seq_along 内存问题大数据集

dpylr - mutate with seq_along memory issues large dataset

我正在使用 dplyr 来操作一个数据帧,该数据帧在我使用的较小测试集上运行良好。对于大型完整数据集(6 个变量的 845986 obs),不幸的是,我 运行 在具有 16 GB RAM 的机器上内存不足。

dataframe的相关部分:

> head(df)
   V2   name
 1  1   A_185
 2  8   A_185
 3 17   A_185
 4 25   A_185
 5 33   A_185
 6  1   A_123
 7  5   A_123
 8 13   A_123
 9 23   A_123

我正在创建一个新列 id2,它应该包含一个基于 V2 列并依赖于名称列的连续序列,例如,对于不同的名称,序列必须重新开始。

结果应该是:

> head(df)
  V2   name   id2
1  1   A_185  1
2  8   A_185  2
3 17   A_185  3
4 25   A_185  4
5 33   A_185  5
6  1   A_123  1
7  5   A_123  2 
8 13   A_123  3
9 23   A_123  4

我使用的代码是:

df<-ddply(df, .(name), mutate, id2 = seq_along(V2))

我试过 .parallel=TRUE 选项,但仍然无济于事。我可以在任务管理器中观察到 R 进程处于 12% CPU(我有 8 个内核)并且 RAM 上升到 12 GB 然后 Linux 终止进程(R 会话在 RStudio 中中止)

一个明显的解决方案是将数据帧拆分为 60-80k 条目的单独块并分别处理它们,但也许有一种解决方案可以一次性完成所有工作?

我们可以使用 row_number() 来自 dplyr

library(dplyr)
df %>%
   group_by(name) %>%
   mutate(id2 = row_number())
# A tibble: 9 x 3
# Groups: name [2]
#     V2 name    id2
#  <int> <chr> <int>
#1     1 A_185     1
#2     8 A_185     2
#3    17 A_185     3
#4    25 A_185     4
#5    33 A_185     5
#6     1 A_123     1
#7     5 A_123     2
#8    13 A_123     3
#9    23 A_123     4

或者使用 data.table

中的 := 使其更快
library(data.table)
setDT(df)[, id2 := seq_len(.N), by = name]