2014-11-24 37 views
4

我有兩個數據幀「Conc」和「Flow」。基於另一個數據集中日期的日期之間的平均值使用R

流在某一特定時期內每天都有一個值,而Conc僅在該時期內的某些日期有一個值。

我想要做的是使用r計算Conc值之間每個週期的平均流量值。

下面的代碼將生成兩個示例數據幀來說明的那種數據集的我正在與工作:

Conc <- data.frame(Date = as.Date(c("2012/01/13", "2012/02/16", "2012/05/02", "2012/07/28", 
     "2012/11/10")), Conc = c(0.88, 0.55, 0.34, 0.21, 0.98)) 
Flow <- data.frame(Date = c(seq(as.Date("2012/01/01"), by = "day", length.out = 365)), 
     Flow = c(sample(seq(from = 0.01, to = 5, by = 0.1), size = 365, replace = TRUE))) 

的輸出數據幀將理想地是這樣的:

Period Mean_Flow 
1   2.01 
2   1.41 
3   3.81 
4   0.31 

我欣賞Conc日之間的可變時間使得這個棘手。目前我所提出的最好的方法是在excel中手動執行此操作,但我真的很想找到一個R解決方案來保存我自己的約10個不同的數據集。

謝謝。

+0

你也許應該在'Conc'上添加'as.Date' – 2014-11-24 11:56:47

+0

另外,你不只有4個時期嗎? – 2014-11-24 12:08:35

+0

感謝您發現這些錯誤David,我現在修改了我的問題。 – 2014-11-24 12:14:35

回答

5

下面是使用data.tablefoverlaps功能的可能的方法:

創建時間間隔在這兩個數據集

主要的Flow數據,以便設置爲使用foverlaps功能和運行功能

setkey(Flow, start, end) 
overlaps <- foverlaps(Conc, Flow, type = "any", which = TRUE) 

在內創建重疊索引個數據集,並通過這些指標

Flow[overlaps$yid, Period := overlaps$xid] 
na.omit(Flow[, list(Mean_Flow = mean(Flow)), by = Period]) 
# Period Mean_Flow 
# 1:  1 2.189412 
# 2:  2 2.263947 
# 3:  3 2.762874 
# 4:  4 2.349048 
+1

謝謝你花時間做這個David。 Data.Table再一次提供了我正在尋找的答案!這工作得很好。 Ĵ – 2014-11-24 14:22:26

0

下面以循環沿濃$日期所有可用的日期要計算的平均值。 Conc $日期是爲了方便放在向量A中。變量p表示應該考慮的值。當循環超過最後給定的日期時,循環停止,並返回NaN。

A <- Conc$Date 

for(i in 1:length(A)) 
{p <- which(Flow$Date>A[i] & Flow$Date<A[i+1]) 
M<-mean(Flow$Flow[p]) 
print(M)}