R 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行中,有

我需要一些帮助来剖析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行中,有约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
from
library(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 mean
from
library(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会花费这么长时间,或者我可能做错了什么吗?@GeorgeBonebright
ddply
是一个有点旧的软件包。我想他们开发
dplyr
的原因之一是为了让它更有效ficient.make sense.再次感谢您的帮助。我用我的运行时总结fysa更新了原始问题。@GeorgeBonebright很高兴为您提供帮助,并感谢UpdateThaks akrun.完美的示例。工作完美且速度惊人。我衷心感谢您的帮助。您知道为什么ddply需要这么长时间,或者我可能一直在做什么吗ong?@GeorgeBonebright
ddply
是一个有点旧的软件包。我想他们开发
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))