gpt4 book ai didi

r - 如何在 R 中优化 sapply 以计算数据帧上的运行总计

转载 作者:行者123 更新时间:2023-12-01 08:27:58 27 4
gpt4 key购买 nike

我在 R 中编写了一个函数来按月数计算累积总数,但是随着数据集变大,我的方法的执行时间呈指数增长。我是新手 R 程序员,你能帮我提高效率吗
函数和我调用函数的方式:

accumulate <- function(recordnum,df){
sumthese <- (df$subject == df$subject[recordnum]) &
(df$month <= df$month[recordnum])
sum(df$measurement[sumthese])
}
set.seed(42)
datalength = 10
df <- data.frame(measurement = runif(1:datalength),
subject=rep(c("dog","cat"),each =datalength/2),
month=rep(seq(datalength/2,1,by=-1)))
system.time(df$cumulative <- sapply(1:datalength,accumulate,df))

输入数据框:

> df
measurement subject month
1 0.4577418 dog 5
2 0.7191123 dog 4
3 0.9346722 dog 3
4 0.2554288 dog 2
5 0.4622928 dog 1
6 0.9400145 cat 5
7 0.9782264 cat 4
8 0.1174874 cat 3
9 0.4749971 cat 2
10 0.5603327 cat 1

输出数据框:

> df
measurement subject month cumulative
1 0.9148060 dog 5 3.6102141
2 0.9370754 dog 4 2.6954081
3 0.2861395 dog 3 1.7583327
4 0.8304476 dog 2 1.4721931
5 0.6417455 dog 1 0.6417455
6 0.5190959 cat 5 2.7524079
7 0.7365883 cat 4 2.2333120
8 0.1346666 cat 3 1.4967237
9 0.6569923 cat 2 1.3620571
10 0.7050648 cat 1 0.7050648

请注意,累积列显示了截至并包括当月的所有测量值的累积。该函数不需要对数据框进行排序。当数据长度等于 100 时,耗时为 0.3。 1000 是 0.58。 10,000 = 27.72。我需要它来运行 200K+ 记录。
谢谢!

最佳答案

dplyr 会让这变得非常简单

library(dplyr)
df %>%
group_by(subject) %>%
arrange(month) %>%
mutate(cumulative = cumsum(measurement))

Source: local data frame [10 x 4]
Groups: subject

measurement subject month cumulative
1 0.7050648 cat 1 0.7050648
2 0.6569923 cat 2 1.3620571
3 0.1346666 cat 3 1.4967237
4 0.7365883 cat 4 2.2333120
5 0.5190959 cat 5 2.7524079
6 0.6417455 dog 1 0.6417455
7 0.8304476 dog 2 1.4721931
8 0.2861395 dog 3 1.7583327
9 0.9370754 dog 4 2.6954081
10 0.9148060 dog 5 3.6102141

虽然如果您正在寻找绝对性能,您可能希望使用 data.table

library(data.table)
setDT(df)[order(month), cumulative := cumsum(measurement), by=subject]

# measurement subject month cumulative
# 1: 0.7050648 cat 1 0.7050648
# 2: 0.6569923 cat 2 1.3620571
# 3: 0.1346666 cat 3 1.4967237
# 4: 0.7365883 cat 4 2.2333120
# 5: 0.5190959 cat 5 2.7524079
# 6: 0.6417455 dog 1 0.6417455
# 7: 0.8304476 dog 2 1.4721931
# 8: 0.2861395 dog 3 1.7583327
# 9: 0.9370754 dog 4 2.6954081
# 10: 0.9148060 dog 5 3.6102141

关于r - 如何在 R 中优化 sapply 以计算数据帧上的运行总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29128275/

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