r - 从 r 中的圆形数据计算移动平均值
问题描述
我想从一系列角度(beta)计算弧度(theta)的平均角度,这些角度存储在一个名为“a”的数据框中:
time beta theta theta2
1 0 na na
2 2.426551575 na na
3 5.890842799 0.678069689 0.678069689
4 0.530641823 0.854950297 0.854950297
5 4.794960386 -0.449975202 5.833210105
6 1.271620156 0.104679019 0.104679019
7 5.789548201 -0.236747291 6.046438017
8 1.053579352 0.610520801 0.610520801
9 0.095112206 0.218351484 0.218351484
10 6.108843722 0.324783324 0.324783324
beta 以弧度为单位,并且是从包装的高西分布中随机抽取的。我想计算 thetas(实际上是 theta2,以弧度为单位)。我通过蛮力做到了这些,将弧度转换为正负单位,pi/-pi 为 180 度,但正在寻找一种更优雅的方法。
我曾希望这会起作用(调用循环和 dplyr 包):
a$theta<-mean.circular(c(a$beta,lag(a$beta),lag(a$beta,2))
但这似乎只返回了 beta 的最后一个值。我已经尝试过子集并且也在循环中(我有另一个名为 time 的字段,它是一个递增的整数)
time beta
1 0
2 2.426551575
3 5.890842799
4 0.530641823
5 4.794960386
6 1.271620156
7 5.789548201
8 1.053579352
9 0.095112206
10 6.108843722
theta<-0
bset<-c(0,0,0)
for (i in time){
bset<-ifelse(i<3,bset,df$beta[(i-2):i])
thetai<-mean.circular(bset)
theta<-c(theta,ifelse(is.na(thetai),0,thetai))
theta<-theta[2:(length(time)+1)]
df<-cbind(df,theta)
}
但这也行不通。谁能告诉我我做错了什么?
解决方案
我相信如果我理解正确,那么您正在尝试计算本质上是循环的数据的移动平均值。如果是这种情况,您可以选择栅格movingFun
函数来获取移动平均线。由于均值本质上不是矢量化的,因此它将始终返回一个值。
如果您粘贴所需的输出,那就太好了。
在这里,我选择延迟值为 2,循环性质为 True。
library(raster)
movingFun(x, n= 2, fun = mean, circular = TRUE)
输入数据:
x <- c(0,2.426551575,
5.890842799,
0.530641823,
4.794960386,
1.271620156,
5.789548201,
1.053579352,
0.095112206,
6.108843722,
1.240271853,
5.350922943)
输出:
> movingFun(x, n= 2, fun = mean, circular = T)
[1] 2.6754615 1.2132758 4.1586972 3.2107423
[5] 2.6628011 3.0332903 3.5305842 3.4215638
[9] 0.5743458 3.1019780 3.6745578 3.2955974
推荐阅读
- r - 将带有列表的 Dataframe 写入 CSV
- python - 如何在 python 中使用 if else 语句将列表放入函数中以创建变量?
- node.js - findOneAndUpdate 并发送短信
- excel - 在excel中用另一个列单元格替换单元格的一部分
- html - 如何为 HTA(Html 应用程序)选择 Internet Explorer 的版本?
- javascript - JavaScript - 循环遍历一次只显示一个的非重复值
- android - 如何使数组列表用于其他活动
- python - How does CPython keep track of the type of an object
- laravel - Laravel 不在主机中运行
- angular - 如何在 Angular 6 中将查询字符串传递给我的服务