分裂,应用函数和返回具有可变向量长度的data.frame的有效方式

时间:2013-12-17 00:54:26

标签: r plyr processing-efficiency

我目前正在尝试使用plyr + reshape2来处理我的数据,但这需要花费很多时间。 我有一个包含3列的数据框( df ):网络 user_id 日期。 我的目标是:

  1. df 拆分为2个级别(网络 user_id );
  2. 在每个拆分中应用函数(get_interval);
  3. 将结果绑定到另一个数据框( df2 )。
  4. 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)))
    

0 个答案:

没有答案