R ddply定时和性能问题
我需要一些帮助来剖析ddply的时间问题的根源。在一个小数据集(~4MB数据帧)上运行ddply函数需要10分钟以上 我尝试以以下方式运行ddply:R ddply定时和性能问题,r,performance,plyr,R,Performance,Plyr,我需要一些帮助来剖析ddply的时间问题的根源。在一个小数据集(~4MB数据帧)上运行ddply函数需要10分钟以上 我尝试以以下方式运行ddply: new_df<- ddply(old_df, .(TIC), mutate, mean_price_3yr=rollmean(price, k=3, align= "right",na.pad=T)) 我的ddply的目的是计算TIC分组的最后3个期间的滚动平均价格。在运行代码之前,我确保至少有3次对TIC的观察。在总共80000行中,有
new_df<- ddply(old_df, .(TIC), mutate, mean_price_3yr=rollmean(price, k=3, align= "right",na.pad=T))
我的ddply的目的是计算TIC分组的最后3个期间的滚动平均价格。在运行代码之前,我确保至少有3次对TIC的观察。在总共80000行中,有约10000个唯一的TIC
在另一篇文章的帮助下,我能够重用ave函数来完成我的任务:
old_df$last3<-ave(old_df$price, old_df$TIC, FUN=function(x) rollmean(x, k=3, align= "right",na.pad=T))
old\u df$last3 system.time(测试%group\u by(LPERMNO)%%>%mutate(平均价格\u 3yr=roll\u平均值(息税折旧摊销前利润,n=3,align=“right”,fill=NA)))
用户系统运行时间
0.570 0.007 0.577
>系统时间(epdata\u 2$delta\u收益我们可以使用roll\u mean
fromlibrary(RcppRoll)
以及dplyr
library(RcppRoll)
library(dplyr)
old_df %>%
group_by(TIC) %>%
mutate(mean_price_3yr = roll_mean(price, n=3,
align="right", fill=NA))
数据
old_df我们可以使用roll\u meanfromlibrary(RcppRoll)
以及dplyr
library(RcppRoll)
library(dplyr)
old_df %>%
group_by(TIC) %>%
mutate(mean_price_3yr = roll_mean(price, n=3,
align="right", fill=NA))
数据
old\u df如果你想提高速度,也许dplyr
(来自同一作者的高级软件包)会很有用。如果你想提高速度,也许dplyr
(来自同一作者的高级软件包)会很有用的。谢谢akrun。完美的例子。工作完美且速度惊人。我衷心感谢您的帮助。知道为什么ddply会花费这么长时间,或者我可能做错了什么吗?@GeorgeBonebrightddply
是一个有点旧的软件包。我想他们开发dplyr
的原因之一是为了让它更有效ficient.make sense.再次感谢您的帮助。我用我的运行时总结fysa更新了原始问题。@GeorgeBonebright很高兴为您提供帮助,并感谢UpdateThaks akrun.完美的示例。工作完美且速度惊人。我衷心感谢您的帮助。您知道为什么ddply需要这么长时间,或者我可能一直在做什么吗ong?@GeorgeBonebrightddply
是一个有点旧的软件包。我想他们开发dplyr
的原因之一是为了提高效率。这很有意义。再次感谢您的帮助。我用我的运行时摘要fysa更新了原始问题。@GeorgeBonebright很高兴帮助您并感谢您的更新
library(RcppRoll)
library(dplyr)
old_df %>%
group_by(TIC) %>%
mutate(mean_price_3yr = roll_mean(price, n=3,
align="right", fill=NA))
old_df <- structure(list(fyear = c(2000L, 2001L, 2002L,
2003L, 2005L, 2006L,
2007L, 2008L, 2009L, 2010L, 2000L, 2001L, 2002L, 2003L,
2004L), TIC = c("AIR", "AIR", "AIR", "AIR", "ADCT",
"ADCT", "ADCT",
"ADCT", "ADCT", "ADCT", "ALO.2", "ALO.2", "ALO.2",
"ALO.2", "ALO.2"
), ebitda = c(64.367, 27.207, 30.745, 47.491, 159, 140.4,
167.9, 173.3, 84.7, 121.4, 190.533, 163.601, 187.264,
155.228, 153.829), price = c(14, 11.44, 4.5, 9.58, 17.45,
14.31, 18.7, 6.34, 8.34, 12.67, 43.875, 26.45, 11.91,
20.1, 16.95)), .Names = c("fyear", "TIC", "ebitda",
"price"), class = "data.frame", row.names = c(NA, -15L))