我目前正在尝试使用plyr
+ reshape2
来处理我的数据,但这需要花费很多时间。
我有一个包含3列的数据框( df ):网络, user_id 和日期。
我的目标是:
get_interval
); get_interval
返回与输入行数相同的向量。
因此, df2 具有相同大小的 df ,但结果由get_interval
计算。
问题在于我无法直接使用ddply
,因为它只处理相等长度的向量,并且函数的结果具有不同的长度。
我提出了这个解决方案:
aux <- melt(dlply(df,.(network,user_id), get_interval))
df2 <- cbind(interval=aux$value,colsplit(aux$L1,"\\.",names=c("network","user_id")))
但它的效率非常低,而且因为 df 非常大,所以每次运行它都会浪费时间。 有没有办法更有效地做到这一点?
get_interval
的基本操作如下:
get_interval <- function(df){
if(nrow(df) < 2)
return (NA)
x <- c(NA,df$date[-1] - df$date[-nrow(df)])
return(x) ## ceiling wont work because some intervals are 0.
}
可以通过以下方式人工生成此数据:
n <- 1000000
ref_time <- as.POSIXct("2013-12-17 00:00:00")
interval_range <- 86400*10 # 10 days
df <- data.frame(user_id=floor(runif(n,1,n/10)),
network=gl(2,n,labels=c("anet","unet")),
value=as.POSIXct(ref_time - runif(n,0,interval_range)))