我正在寻找一种更有效的方法来对数据执行求和和均值计算。我有一个相当大的数据帧(9行x 10 ^ 6列),包括在不同位置测量几年。我想计算并绘制每个站在不同时间范围内不同测量值的总和和平均值。我的测试数据集中有大约3000个工作站。
数据的截断版本为
Station DTG weight length
1 2010-2-15 01:00:00 7 54
2 2010-2-15 01:00:00 3 34
3 2010-2-15 01:00:00 6 51
...
1 2010-2-15 02:00:00 6 54
2 2010-2-15 02:00:00 9 73
3 2010-2-15 02:00:00 6 56
DTG是使用ISOdatetime创建的日期和时间。
我想计算每个电台每天(和月份)的平均重量和长度。我希望能够找到最小值和最大值。计划是将其放入数据框中,以便我可以查询和绘制。
我的手动解决方案是使用子集并半手动执行此操作。显然,这对于完整的数据集来说并不实用。
我找到了一个计算每日降雨量数据的例子,但是我无法将其用于工作,也没有找到扩展到多个站点的方法。
答案 0 :(得分:0)
首先,我希望你的意思是9个变量(列)和100万个记录(行),因为这个答案是针对那些数据集的。
首先,您可以强制使用您的角色字段&#39; DTG&#39;使用myData$DTG_ct <- as.POSIXct()
到日期时间,因为此列已经是默认格式,您可以创建一个常规的时间点数组,如下所示:
cutPoints <- as.POSIXct(outer(2000:2010,c('01',03,'07','10'),paste,'01 01:00:00 PST',sep = '-'))
cutPointNames <- outer(outer(2000:2010,c('Q1','Q2','Q3','Q4')),paste)
这里我计算了四分之一的季度,但你可以很容易地创建一个月的数组。要创建日期数组,请使用as.Date(myData$DTG_ct)
然后,您可以使用cut()
创建一个有序因子,将您的数据分组为如下所示的时间段:
myData$DTG_quarter<-cut(x=myData$DTG_ct,
breaks=cutPoints,
labels=cutPointNames[-length(cutPOInts)])
# notice that cut() creates missing values before the first cutpoint
# and after the last, and the labels are applied to data points that fall
# between cut points, so there needs to be one fewer labels than cut points.
然后您可以使用dplyr
在时间段内生成各种统计信息,并使用这样的电台:
library(dplyr)
myData %>%
group_by(station,DTG_quarter) %>%
summarise(wt_mean=mean(weight),
wt_sd=sd(weight),
length_mean=mean(length),
length_sd=mean(length))
有关上述内容的详细信息,请阅读dplyr插图简介,安装browseVignettes('dplyr')
后可以使用dplyr
找到