将变量递增N次并将答案存储在矩阵中

时间:2016-10-21 16:32:06

标签: r increment

我有一个简单的公式,包括两个变量,方位角和波束宽度。方位角表示由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

2 个答案:

答案 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