将值分组一定的时间间隔并计算平均值

时间:2014-11-03 11:45:25

标签: r

我正在研究土壤呼吸(CO2通量)的数据。每10分钟自动测量土壤呼吸。

我的数据集包含以下列:

  
      
  •   
  •   
  • 小时
  •   
  • 分钟
  •   
  • 以十进制单位表示的时间(日+小时/ 24 +分钟/(24 * 60)
  •   
  • 土壤呼吸
  •   

土壤呼吸每10分钟测量一次,因此我每天有144个值。 对于特定的分析,我需要每天3小时获得值的均值。

  
      
  • 0h:第一天00:00的值为1,然后是21:10到00:00之间的平均值
  •   
  • 3h(平均0:10,0:20,0:30,0:40,0:50,1:0,1:10,1:20,[...] 2:50; 3: 00)18个值的平均值。
  •   
  • 6h(3:10到6:00之间的平均值)
  •   
  • 12h(6:10到12:00之间的平均值)
  •   
  • 15h(12:10至15:00之间的平均值)
  •   
  • 18h(15:10到18:00之间的平均值)
  •   
  • 21h(18:10至21:00之间的平均值)
  •   
  • 00h(21:10到00:00之间的平均值)
  •   

...等 因此,对于每一天,我想获得8个土壤呼吸值,每个值是18个值的平均值。

我怎么能用R编程呢? 我有很大的数据集,所以我不能每天手动完成。

数据集示例:

Year =c(2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,2014)
Day= c(274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274,274)
Hours= c(0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3)
Minutes = c(0,10,20,30,40,50,0,10,20,30,40,50,0,10,20,30,40,50,0,10,20,30,40,50) 
Time_Dec=c(274.000,274.007,274.014,274.021,274.028,274.035,274.042,274.049,274.056,274.063,274.069,274.076,274.083,274.090,274.097,274.104,274.111,274.118,274.125,274.132,274.139,274.146,274.153,274.160)
Flux=c(0.84,0.88,0.91,0.95,0.98,1.02,0.84,0.87,0.91,0.94,0.98,1.01,0.83,0.87,0.90,0.94,0.97,1.01,0.83,0.87,0.90,0.94,0.97,1.00)

所以,我想保留第一个值,然后得到第18个值的平均值(直到Time_Dec= 274.125

2 个答案:

答案 0 :(得分:2)

可能有帮助:

dat$datetime <-  with(dat, as.POSIXct(sprintf('%04d %03d %02d %02d', Year, Day,
                              Hours, Minutes), format='%Y %j %H %M') )

dat$Hgroup <- format(as.POSIXct(cut(dat$datetime, breaks='3 hour')), '%H')

library(dplyr)
res <- dat %>% 
           group_by(Year, Day,Hgroup) %>%
           summarise(MeanSoilResp= mean(SoilResp, na.rm=TRUE))

 head(res,10)
 #   Year Day Hgroup MeanSoilResp
 #1  2012   1     00   0.36047216
 #2  2012   1     03  -0.41095240
 #3  2012   1     06  -0.05942487
 #4  2012   1     09   0.22131365
 #5  2012   1     12   0.33759119
 #6  2012   1     15  -0.07563378
 #7  2012   1     18   0.03608052
 #8  2012   1     21  -0.21778018
 #9  2012   2     00   0.13301751
 #10 2012   2     03  -0.02268468

更新

如果订购了数据集,您可以尝试:

 indx <- c(0,(1:nrow(dat)-1) %/%18+1)
 dat$indx <- indx[-length(indx)]
 res1 <- dat %>% 
             group_by(indx) %>%
             summarise(MeanSoilResp= mean(SoilResp, na.rm=TRUE))
 head(res1,3)
 #     indx MeanSoilResp
 #1     0  1.254720853
 #2     1  0.214753060
 #3     2 -0.273466865

数据

 set.seed(142)
 dat <- data.frame(Year=2012, Day=rep(1:14, each=144,
     length.out=2000), Hours= rep(0:23, each=6,
     length.out=2000),Minutes=rep(seq(0,50,by=10),
     length.out=2000), SoilResp=rnorm(2000)) 

答案 1 :(得分:2)

谢谢,以下脚本运行正常:

indx <- c(0,(1:nrow(dat)-1) %/%18+1)

dat$indx <- indx[-length(indx)]

res1 <- dat %>%

group_by(indx) %>%

summarise(MeanSoilResp= mean(SoilResp, na.rm=TRUE))

有关信息,我需要这样做,因为土壤温度和土壤湿度的数据仅每3小时收集一次。为了研究温度/土壤湿度与土壤呼吸之间的关系,我有两种可能性:

  • 抽取建模:我每3小时仅使用土壤呼吸值
  • 聚合建模:3小时意味着