gpt4 book ai didi

r - 为什么在具有许多组的大型数据帧上拆分效率低下?

转载 作者:行者123 更新时间:2023-12-03 16:53:49 26 4
gpt4 key购买 nike

df %>% split(.$x)

对于大量唯一的 x 值,速度会变慢。如果我们改为手动将数据帧拆分为更小的子集,然后对每个子集执行拆分,我们至少可以将时间减少一个数量级。
library(dplyr)
library(microbenchmark)
library(caret)
library(purrr)

N <- 10^6
groups <- 10^5
df <- data.frame(x = sample(1:groups, N, replace = TRUE),
y = sample(letters, N, replace = TRUE))
ids <- df$x %>% unique
folds10 <- createFolds(ids, 10)
folds100 <- createFolds(ids, 100)

运行 microbenchmark给我们
## Unit: seconds

## expr mean
l1 <- df %>% split(.$x) # 242.11805

l2 <- lapply(folds10, function(id) df %>%
filter(x %in% id) %>% split(.$x)) %>% flatten # 50.45156

l3 <- lapply(folds100, function(id) df %>%
filter(x %in% id) %>% split(.$x)) %>% flatten # 12.83866

split不是为大型团体设计的?除了手动初始子集之外还有其他选择吗?

我的笔记本电脑是 2013 年末的 macbook pro,2.4GHz 8GB

最佳答案

这不是严格的 split.data.frame问题,对于许多组,data.frame 的可扩展性存在一个更普遍的问题。
如果您使用 split.data.table,您可以获得相当不错的加速.我在常规 data.table 方法的基础上开发了这种方法,它似乎在这里扩展得很好。

system.time(
l1 <- df %>% split(.$x)
)
# user system elapsed
#200.936 0.000 217.496
library(data.table)
dt = as.data.table(df)
system.time(
l2 <- split(dt, by="x")
)
# user system elapsed
# 7.372 0.000 6.875
system.time(
l3 <- split(dt, by="x", sorted=TRUE)
)
# user system elapsed
# 9.068 0.000 8.200
sorted=TRUE将返回与 data.frame 方法相同顺序的列表,默认情况下 data.table 方法将保留输入数据中的顺序。如果你想坚持使用 data.frame 你可以在最后使用 lapply(l2, setDF) .

附注。 split.data.table在 1.9.7 中添加,devel 版本的安装非常简单
install.packages("data.table", type="source", repos="http://Rdatatable.github.io/data.table")

更多详情请见 Installation wiki .

关于r - 为什么在具有许多组的大型数据帧上拆分效率低下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39545400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com