0

Ca data <- cut(data$Time, breaks=seq(0, max(data$Time)+400, 400))  by(data$Oxytocin, cut, mean)

但这仅适用于一个人的数据....但是我有十个人有自己的时间和催产素数据....我如何同时获得他们的平均值?也不要有这种类型的输出:

cuts: (0,400]
[1] 0.7
------------------------------------------------------------ 
cuts: (400,800]
[1] 0.805

有没有办法让我获得这些削减的清单?

4

1 回答 1

1

这是使用IRanges包的解决方案。

idx假设您的数据格式是Time, data, Time, data, ... 等等。因此,它会创建索引1,3,5,...ncol(df)-1

ir1是您想要平均值的间隔。它的宽度是 400。每个时间列(这里是第 1 列和第 3 列)从 0 到 max(Time)。

ir2是间隔宽度 = 1 的对应时间列。

然后我得到 with 的重叠ir1ir2它基本上告诉我 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列,您将获得一个包含间隔和该间隔平均值的列表。

于 2013-02-20T15:52:01.197 回答