这是使用IRanges
包的解决方案。
idx
假设您的数据格式是Time
, data
, Time
, data
, ... 等等。因此,它会创建索引1,3,5,...ncol(df)-1
。
ir1
是您想要平均值的间隔。它的宽度是 400。每个时间列(这里是第 1 列和第 3 列)从 0 到 max(Time)。
ir2
是间隔宽度 = 1 的对应时间列。
然后我得到 with 的重叠ir1
,ir2
它基本上告诉我 ir2 的哪些间隔与 ir1 重叠(我们想要),我从中计算平均值并输出data.frame
.
idx <- seq(1, ncol(df), by=2)
o <- lapply(idx, function(i) {
ir1 <- IRanges(start=seq(0, max(df[[i]]), by=401), width=401)
ir2 <- IRanges(start=df[[i]], width=1)
t <- findOverlaps(ir1, ir2)
d <- data.frame(mean=tapply(df[[i+1]], queryHits(t), mean))
cbind(as.data.frame(ir1), d)
})
> o
# [[1]]
# start end width mean
# 1 0 400 401 0.6750000
# 2 401 801 401 0.8050000
# 3 802 1202 401 0.8750000
# 4 1203 1603 401 0.2285333
# [[2]]
# start end width mean
# 1 0 400 401 0.73508
# 2 401 801 401 0.13408
# 3 802 1202 401 0.26408
# 4 1203 1603 401 1.06408
# 5 1604 2004 401 3.06408
对于每一Time
列,您将获得一个包含间隔和该间隔平均值的列表。