我想从一系列角度(β)计算弧度(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是以弧度为单位,并且是从包裹的gauchy分布中随机抽取而生成的。我想计算thetas(实际上是theta2,以弧度表示)。我通过蛮力做了这些,将弧度转换为正/负单位,pi / -pi为180度,但正在寻找更优雅的方法。
我曾希望这会起作用(调用circular和dplyr包):
a$theta<-mean.circular(c(a$beta,lag(a$beta),lag(a$beta,2))
但这似乎只能返回beta的最后一个值。我已经尝试了子集,也在循环中(我有另一个称为时间的字段是递增整数)
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)
}
但这也行不通。谁能告诉我我做错了什么?
答案 0 :(得分:1)
我相信如果我理解正确,那么你正在尝试计算本质上是循环的数据的移动平均值。如果是这种情况,您可以选择栅格的movingFun
函数来获取移动平均线。由于mean本质上没有矢量化,因此它总是会返回一个值。
如果粘贴所需的输出会很好。
在这里,我选择滞后值为2,循环性质为真。
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