2011-08-01 112 views
4

我有三列的数据帧的:IdDateValue,并希望通过平均下采样这样的:取接下来的20行,从这些20行建立的Value平均并将其添加到一个新的数据帧相同的结构。 Date应该是20行的第一个值。平均n行

我尝试了这种方式(可能是可怕的:):

resample.downsample <- function(data, by=20) 
{ 
    i <- 0 
    nmax <- nrow(data) 
    means <- c() 
    while(i < nmax) 
    { 
    means <- c(means, mean(subset(data, Id > i & Id <= i+by)$Value)) 
    i <- i+by 
    } 
    return (
    data.frame(
     Id = seq(1, length.out=(nmax/by), by=1), 
     Date = seq(startDate, length.out=(nmax/by), by=(1/by)), 
     Value = means 
    ) 
) 
} 

这工作因此对于小型数据集,但永远运行在我的真实数据集(〜400万行)。任何想法如何优化这个功能?

抽样数据(输入,输出应具有相同的结构,类:整数,数字,POSIXct/POSIXt):

Value Id Date 
1 125 1 2011-06-30 22:41:50 
2 127 2 2011-06-30 22:41:50 
3 126 3 2011-06-30 22:41:50 
4 123 4 2011-06-30 22:41:50 
5 130 5 2011-06-30 22:41:50 
6 131 6 2011-06-30 22:41:50 
7 128 7 2011-06-30 22:41:50 
+0

您的数据的一个小样本将有所帮助...我不确定日期和ID的格式。 – Seth

+0

@Seth:添加了示例数据:) – Fge

回答

4

看到这个答案应该为你工作的方法。 How to get the sum of each four rows of a matrix in R。在你的情况将是:

colMeans(matrix(data$Value, nrow=20)) 

您当前的方法来获得的第一个日期应该罚款。

+0

谢谢:)(我只需要用colMeans替换colSums) – Fge

+0

是的,当然,谢谢。答案也改变了。 – Aaron