对于 Dataframe 中的每个时间点,我有2到4个测量值。我想计算移动平均值,因此对于给定的时间点,我有一个值,该值是该时间点+之前的时间点和之后的时间点的所有测量值的平均值。
cellcounts <-c(80, 188, 206, 162, 106, 90, 85, 109, 87, 94, 86, 196, 132, 135, 84, 122, 67, 88, 81, 121, 9, 93, 117, 91, 108, 103, 119, 100, 18, 98, 93, 119, 140, 160, 101, 82, 111, 103, 28, 72, 144, 85, 1)
time <-c(-2.7, -2.8, -2.9, -3.0, -3.1, -3.2, -3.3, -3.4, -3.5, -3.6, -2.7, -2.8, -2.9, -3.0, -3.1, -3.2, -3.3, -3.4, -3.5, -3.6, -3.9, -3.0, -3.1, -3.2, -3.3, -3.4, -3.5, -3.7, -2.5, -2.6, -2.9, -3.0, -3.2, -3.3, -3.4, -3.5, -3.7, -3.8, -2.5, -2.6, -3.7, -3.8, -3.9)
df <- data.frame(cellcounts, time)
df <- df[order(df$time),]
df
zoo::rollapply(df, width = 3, FUN = mean, align = "center", fill = NA)
5条答案
按热度按时间nvbavucw1#
问题没有指定结果应该是什么,所以我们假设所需的结果是一个滚动平均向量,其元素数量与输入
df
中的行数相同。(2)和(3)压缩和解压缩数据,因此如果需要压缩版本,则仅省略rep.int
(即最后一步)在这两个步骤中的任何一个。请注意,我们不能简单地压缩数据并使用
rollapply
,因为不同的运行具有不同的长度。这些解决方案考虑到了这一点。它们都使用rollapply,但使用方法不同。(2)在代码行方面似乎特别短。
1)偏移量列表
rollapply
的width
参数可以是表示要使用的偏移量的向量列表,因此创建该列表offsets
,然后运行rollapply
。我们假设前一时间是当前时间-0.1,下一时间是当前时间+0.1。
我们转换为整数倍,以避免浮点不精确。
before
是返回到开始的位置数,after
是向前到结束的位置数。2)压缩/解压缩在相同的时间运行中取和和长度,对每个执行
rollapply
并除法。然后使用rep.int
解压缩。3)weighted.mean类似于(2),但我们使用
weighted.mean
组合均值而不是总和。4)宽格式这将序列号
seqno
添加到运行中的每个连续相等时间(运行中的第一行为1,下一行为2,依此类推),然后使用read.zoo
转换为宽格式。然后,我们使用rollapply
生成答案的压缩形式,并如上所述使用rep.int
将其扩展到最终结果。正在检查
四个人都给予了同样的答案:
6pp0gazn2#
在碱R中:
或者,在终点处仅取2个时间步长的平均值:
hvvq6cgz3#
像这样吗
Base R
使用
tapply
计算时间均值,然后计算滚动均值。创建于2023-09-20使用reprex v2.0.2
关于
aggregate
创建于2023-09-20使用reprex v2.0.2
包
dplyr
使用
summarise
计算按时间分组的均值,然后计算滚动均值。创建于2023-09-20使用reprex v2.0.2
5jvtdoz24#
zoo-FAQ建议对每次具有多个测量值的时间序列进行重复数据消除。
下面是一个示例,
aggregate()
使用mean()
复制度量值,然后应用滚动平均值。deikduxw5#
使用dplyr和slider
我们使用
consecutive_id
来创建一个递增的整数ID,确保相邻的时间点之间总是相隔1的距离。然后,我们将该ID传递给
slide_index_mean
,slide_index_mean
通过计算共享时间间隔的平均值来考虑重复的时间点。