【问题标题】:Group the values for a certain time interval and calculate the means对特定时间间隔的值进行分组并计算均值
【发布时间】:2014-11-03 11:45:24
【问题描述】:

我正在研究一段时间内的土壤呼吸(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 之间的平均值)
  • 12 小时(6:10 到 12:00 之间的平均值)
  • 15 小时(12:10 到 15:00 之间的平均值)
  • 18 小时(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

【问题讨论】:

  • 您可以使用cut 对值进行分组。如果您显示一个小型示例数据集可能会更好。
  • 您的列中有Month 信息吗?
  • 不,我只有当天的数字。例如,今天是第 307 天。第 1 天是一月的第一天。
  • 我会看看它。告诉 R 计算每 18 个值的平均值会更容易吗?将 18 个值分组并从数据集的开头开始(我只需要删除第一行)......但我不知道该怎么做。
  • 是的,这些值都是按时间顺序排列的。

标签: r


【解决方案1】:

这可能会有所帮助:

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)) 

【讨论】:

  • 感谢您的回答。该脚本有效,但我没有获得我想要的结果。使用数据 (dat),如果我手动计算平均值 (x=dat$SoilResp x1=x[1] c1=c(x[2],x[3],x[4],x[5],x [6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15],x [16],x[17],x[18],x[19]) x2=mean(c1) x2 c2=c(x[20],x[21],x[22],x[23], x[24],x[25],x[26],x[27],x[28],x[29],x[30],x[31],x[32],x[33], x[34],x[35],x[36],x[37]) x3=均值(c2) x3)。我获得: 1.254721, 0.2147531, -0.2734669 对于 3 第一个手段。这不是我们通过脚本获得的...
【解决方案2】:

谢谢,以下脚本运行良好:

indx &lt;- c(0,(1:nrow(dat)-1) %/%18+1)

dat$indx &lt;- indx[-length(indx)]

res1 &lt;- dat %&gt;%

group_by(indx) %&gt;%

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

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

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

【讨论】:

    猜你喜欢
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多