我正在使用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
Run Code Online (Sandbox Code Playgroud)
我正在创建一个新的列id2,它应该包含一个基于V2列的连续序列,并且依赖于name列,例如,对于一个不同的名称,序列必须重新开始.
结果应该是:
> 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
Run Code Online (Sandbox Code Playgroud)
我使用的代码是:
df<-ddply(df, .(name), mutate, id2 = seq_along(V2))
Run Code Online (Sandbox Code Playgroud)
我尝试过这个.parallel=TRUE选项,但仍无济于事.我可以在12%CPU(我有8个内核)的任务管理器中观察R进程,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
Run Code Online (Sandbox Code Playgroud)
或使其有更多更快的:=从data.table
library(data.table)
setDT(df)[, id2 := seq_len(.N), by = name]
Run Code Online (Sandbox Code Playgroud)