我有一个简单的公式,包括两个变量,方位角和波束宽度。方位角表示由0度到360度的整数值给出的天线的方向/方向。波束宽度代表天线的水平宽度,类似于一块苹果馅饼的水平宽度。
cellPoints <- (Azimuth - (Beamwidth/2))%%360
如果我的方位角/方位是120度,我的波束宽度是60度,这意味着我的边缘在120-(60/2)和120+(60/2)。由于我的极左角是90度,我希望从波束宽度/ 6增加到90度,直到我达到150度。
我想将结果存储在矩阵中。这对于一次性计算来说很容易实现,但我的方位角和波束宽度具有许多不同的值。是应该使用for循环还是使用apply系列之一?
我的数据框如下所示:
我的表格如下:
Cell Name Azimuth Beamwidth cellPoints
ABCDU09A3 120 65 87.5 98.33 109.16 119.99 130.82 141.65 152.48
ABCDU09B3 240 65
ABCDU09C3 0 65
答案 0 :(得分:1)
你想要一个这样的序列吗?
edges = seq(Azimuth - Beamwidth/2, Azimuth + Beamwidth/2, Beamwidth/6)%%360
的结果
Azimuth = 120
Beamwidth = 60
> edges
[1] 90 100 110 120 130 140 150
如果您有多个方位角值和相应的波束宽度,请执行以下操作:
Azimuth = c(120,300,40)
Beamwidth = c(60,30,6)
df = data.frame(Azimuth, Beamwidth)
points = apply(df,1, function(x) seq(x[1]-x[2]/2,x[1]+x[2]/2,x[2]/6) %% 360)
>points
[,1] [,2] [,3]
[1,] 90 285 37
[2,] 100 290 38
[3,] 110 295 39
[4,] 120 300 40
[5,] 130 305 41
[6,] 140 310 42
[7,] 150 315 43
修改强>
使用您的数据框,您应该:
cellNames = c("ABCDU09A3","ABCDU09B3","ABCDU09C3")
Azimuth = c(120,240,0)
Beamwidth = c(65,65,65)
df = data.frame(cellNames,Azimuth, Beamwidth)
points = apply(df[,2:3],1, function(x) seq(x[1]-x[2]/2,x[1]+x[2]/2,x[2]/6) %% 360)
df = cbind(df,t(points))
<强>结果:强>
cellNames Azimuth Beamwidth 1 2 3 4 5 6 7
1 ABCDU09A3 120 65 87.5 98.33333 109.1667 120 130.83333 141.66667 152.5
2 ABCDU09B3 240 65 207.5 218.33333 229.1667 240 250.83333 261.66667 272.5
3 ABCDU09C3 0 65 327.5 338.33333 349.1667 0 10.83333 21.66667 32.5
如您所见,apply函数中的function(x)
将数据框x
的每一行都作为df
参数,但只有第2列和第3列(方位角和带宽)。< / p>
apply函数的结果存储在列中,为了将其绑定到df
,您需要按行显示结果,因此请使用t(points)
进行转置。
答案 1 :(得分:1)
您可以在向量上使用按元素操作:
# arbitrary values
azimuths <- c(10, 20, 30, 40, 50, 60)
beamwidths <- c(1, 2, 3, 4, 5, 6)
# this means that each of the elements of resulting vector is equal to an element of azimuths vector minus half of corresponding element of beamwidths vector, you can do similarly with two-dimensional structures too
edgesStart <- azimuth - beamwidths/2
edgesEnd <- azimuth + beamwidths/2
matrix(c(edgesStart, edgesEnd), ncol=2)
[,1] [,2]
[1,] 9.5 10.5
[2,] 19.0 21.0
[3,] 28.5 31.5
[4,] 38.0 42.0
[5,] 47.5 52.5
[6,] 57.0 63.0