2014-11-24 35 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)}