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]
我正在使用 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]