避免R中的循环
我决定学习R。我试图了解如何编写“R风格”函数并避免循环。以下是一个示例情况: 给定一个向量避免R中的循环,r,loops,R,Loops,我决定学习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]) 1类似于b=filter(a,rep(1.0/5,5),sides=1)的东西将完成这项工作,尽管您可能会在前几个插槽中得到零,而不是NaN。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])
1类似于b=filter(a,rep(1.0/5,5),sides=1)的东西将完成这项工作,尽管您可能会在前几个插槽中得到零,而不是NaN。R有一个大型的内置函数库,“R风格”就是尽可能地使用这些函数。请查看过滤器
功能的文档。类似b=filter(a,rep(1.0/5,5),sides=1)
将完成此工作,尽管您可能会在前几个插槽中得到零,而不是NaN。R有一个大型的内置函数库,“R风格”就是尽可能地使用这些函数。请查看过滤器功能的文档。因为这些滚动功能通常适用于时间序列数据,一些更新更丰富的时间序列数据处理软件包已经为您提供了:
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>
R>库(动物园)##加载动物园
R> 速度zsp rollmean(zsp,5)##默认使用
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”)###带填充并对齐
1 2 3 4 5 6 7 8 9 10 11
NA NA NA 1.0 1.6 2.6 3.0 4.0 5.4 6.4
R>
有优秀的文档,将向您展示更多的示例,特别是如何使用真实(可能是不规则)日期执行此操作;进一步扩展了这一点,但这是一个更好的起点。因为这些滚动函数通常适用于时间序列数据,一些更新更丰富的时间序列数据处理包已经为您提供了:
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>
R>库(动物园)##加载动物园
R> 速度zsp rollmean(zsp,5)##默认使用
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”)###带填充并对齐
1 2 3 4 5 6 7 8 9 10 11
NA NA NA 1.0 1.6 2.6 3.0 4.0 5.4 6.4
R>
有优秀的文档,将向您展示更多的示例,特别是如何使用真实(可能是不规则)日期执行此操作;进一步扩展,但这是一个更好的起点。您还可以使用cumsum
和diff
的组合来通过滑动窗口获得总和。您需要使用自己的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
>速度差(总和(c(0,速度)),5)/5
[1] 1.0 1.6 2.6 3.0 4.0 5.4 6.4
您还可以使用cumsum
和diff
的组合来通过滑动窗口获得总和。您需要使用自己的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
>速度差(总和(c(0,速度)),5)/5
[1] 1.0 1.6 2.6 3.0 4.0 5.4 6.4
是的,这可能是最简单的移动平均线实施是的,这可能是最简单的移动平均线实施