dpylr - 使用seq_along内存的mutate发出大数据集

时间:2018-04-05 09:55:13

标签: r dplyr plyr

我使用dplyr来操作一个数据帧,该数据帧与我使用的较小测试集一起工作正常。使用大型完整数据集(8个变量为845986 obs),遗憾的是,在具有16 GB RAM的计算机上内存不足。

数据框的相关部分:

> 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选项,但仍无济于事。我可以在12%CPU(我有8个内核)的任务管理器中观察R进程,RAM上升到12 GB然后Linux终止进程(R会话在RStudio中止)

一个明显的解决方案是将数据框拆分为60-80k条目的单独块并单独处理它们但是可能有一个解决方案可以一次完成所有这些操作吗?

1 个答案:

答案 0 :(得分:5)

我们可以使用el

中的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