基于使用R的另一数据集中的日期的日期之间的平均值

时间:2014-11-24 11:47:08

标签: r

我有两个数据框“Conc”和“Flow”。

Flow在一段时间内具有每天的值,而Conc仅在该期间的某些日期具有值。

我想要做的是使用r计算Conc值之间每个句点的平均Flow值。

以下代码将生成两个示例数据框,以说明我正在使用的数据集类型:

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个不同的数据集执行此操作。

谢谢。

2 个答案:

答案 0 :(得分:5)

以下是使用data.tablefoverlaps函数的可行方法:

在两个数据集中创建时间间隔

library(data.table)
Conc <- setDT(Conc)[, `:=`(start = Date, end = c(Date[2:(.N - 1)] - 1, Date[.N], NA))][-.N]
Flow <- setDT(Flow)[, `:=`(start = Date, end = Date)]

键入Flow数据集以使用foverlaps函数并运行函数

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

创建Flow数据集内重叠的索引,并按这些索引计算均值

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 :(得分:0)

以下内容使用Conc $ Date中所有可用日期的循环。 Conc $ Date是为了方便放在向量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)}