我正在研究土壤呼吸(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
)
答案 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小时收集一次。为了研究温度/土壤湿度与土壤呼吸之间的关系,我有两种可能性: