我有两个数据框“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个不同的数据集执行此操作。
谢谢。
答案 0 :(得分:5)
以下是使用data.table
包foverlaps
函数的可行方法:
在两个数据集中创建时间间隔
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)}