gpt4 book ai didi

r - 如何从大型数据集中优化子集?

转载 作者:行者123 更新时间:2023-12-04 11:51:34 25 4
gpt4 key购买 nike

我有这个金融交易数据集,它相当大但小到可以保存在内存中。

R> str(trans)
'data.frame': 130000000 obs. of 5 variables:
$ id : int 5 5 5 5 6 11 11 11 11 11 ...
$ kod : int 2 3 2 3 38 2 3 6 7 6 ...
$ ar : int 329 329 330 330 7 329 329 329 329 329 ...
$ belopp: num 1531 -229.3 324 -48.9 0 ...
$ datum : int 36976 36976 37287 37287 37961 36976 36976 37236 37236 37281 ...

我需要遍历它来提取每个唯一 id 的交易,并进行大量计算。问题是数据集的子集太慢了..
R> system.time(
+ sub <- trans[trans$id==15,]
+ )
user system elapsed
7.80 0.55 8.36


R> system.time(
+ sub <- subset(trans, id == 15)
+ )
user system elapsed
8.49 1.05 9.53

由于这个数据集中有大约 10m 的唯一 ID,这样的循环将永远持续下去,我有什么想法可以加快速度吗?

编辑
我涉足过“data.tables”、索引和排序,但运气不佳。
library(data.table)
trans2 <- as.data.table(trans)
trans2 <- trans2[order(id)]
trans2 <- setkey(trans2, id)

R> system.time(
+ sub <- trans2[trans2$id==15,]
+ )
user system elapsed
7.33 1.08 8.41

R> system.time(
+ sub <- subset(trans2, id == 15)
+ )
user system elapsed
8.66 1.12 9.78

编辑2 惊人的。
R> system.time(
+ sub <- trans2[J(15)]
+ )
user system elapsed
0 0 0

最佳答案

Note:该帖子已通过更改从 rowSums 计算的函数进行了编辑至 colSums (在 data.table 的情况下使用 lapply)

我认为您无法比 data.table 更快地获得结果.这是 plyr 之间的基准和 data.table .当然,如果耗时的部分是你的函数,那么你可以使用 doMC使用 plyr 并行运行(假设你有很多核心或者你在一个集群上工作)。否则,我会坚持 data.table .这是具有大量测试数据和虚拟函数的分析:

# create a huge data.frame with repeating id values
len <- 1e5
reps <- sample(1:20, len, replace = TRUE)
x <- data.frame(id = rep(1:len, reps))
x <- transform(x, v1 = rnorm(nrow(x)), v2 = rnorm(nrow(x)))

> nrow(x)
[1] 1048534 # 1 million rows

# construct functions for data.table and plyr
# method 1
# using data.table
DATA.TABLE <- function() {
require(data.table)
x.dt <- data.table(x, key="id")
x.dt.out <- x.dt[, lapply(.SD, sum), by=id]
}

# method 2
# using plyr
PLYR <- function() {
require(plyr)
x.plyr.out <- ddply(x, .(id), colSums)
}

# let's benchmark
> require(rbenchmark)
> benchmark(DATA.TABLE(), PLYR(), order = "elapsed", replications = 1)[1:5]
test replications elapsed relative user.self
1 DATA.TABLE() 1 1.006 1.00 .992
2 PLYR() 1 67.755 67.351 67.688

在具有 100 万行的 data.frame 上, data.table需要 0.992 seconds .使用 data.table 的加速与 plyr 相比(诚​​然,在计算列总和时)是 68x .根据函数中的计算时间,这种加速会有所不同。但是 data.table仍然会更快。 plyr是一种拆分-应用-组合策略。我认为与使用 base 来拆分、应用和组合自己相比,您不会获得可比的加速。当然你可以试试。

我运行了 1000 万行的代码。 data.table运行时间为 5.893 秒。 plyr耗时 6300 秒。

关于r - 如何从大型数据集中优化子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14139586/

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