2009-12-11 199 views
1

我决定学习R.我想了解如何编写“R风格”功能并避免循环。下面是一个示例情况:避免循环在R

给定一个向量a,我想以计算矢量b其元素b[i](矢量索引从1开始)的定义如下:

1 <= i <= 4: 
b[i] = NaN 

5 <= i <= length(a): 
b[i] = mean(a[i-4] to a[i]) 

本质上,如果我们假装'a'是一个速度列表,其中第一个条目在时间= 0,第二个在时间= 1秒,第三个在时间= 2秒...我想获得描述平均速度的相应向量,过去5秒钟。

例如为: 如果a is (1,1,1,1,1,4,6,3,6,8,9)然后b应该(NaN, NaN, NaN, NaN, 1, 1.6, 2.6, 3, 4, 5.4, 6.4)

我可以用这一个循环做的,但我觉得这样做会不会在“R风格”。

谢谢

Tungata

回答

3

喜欢的东西b = filter(a, rep(1.0/5, 5), sides=1)将做的工作,虽然你可能会得到零的前几插槽,而不是NaN的。 R有一个大型的内置函数库,“R风格”是尽可能使用这些函数。看看filter函数的文档。

+0

是的,这可能是最简单可行的移动平均实现 – 2009-12-11 13:01:11

5

由于这些滚动功能往往与时间序列数据,一些较新的,更丰富的时间序列数据处理软件包的应用已经为你做的:

R> library(zoo) ## load zoo 
R> speed <- c(1,1,1,1,1,4,6,3,6,8,9) 
R> zsp <- zoo(speed, order.by=1:length(speed)) ## creates a zoo object 
R> rollmean(zsp, 5)        ## default use 
    3 4 5 6 7 8 9 
1.0 1.6 2.6 3.0 4.0 5.4 6.4 
R> rollmean(zsp, 5, na.pad=TRUE, align="right") ## with padding and aligned 
    1 2 3 4 5 6 7 8 9 10 11 
NA NA NA NA 1.0 1.6 2.6 3.0 4.0 5.4 6.4 
R> 

zoo有出色的文档,将显示你有很多更多的例子,特别是如何用真实的(也可能是不规则的)日期来做到这一点; xts进一步延伸,但zoo是一个更好的起点。

1

您也可以使用cumsumdiff的组合来获得滑动窗口的总和。你需要垫用自己的NaN,虽然:

> speed <- c(1,1,1,1,1,4,6,3,6,8,9) 
> diff(cumsum(c(0,speed)), 5)/5 
[1] 1.0 1.6 2.6 3.0 4.0 5.4 6.4