首页 > 解决方案 > 如何计算R中一系列样本中两个线向量之间的角度列表?

问题描述

我正在研究具有二维笛卡尔坐标(即地标)的生物标本的几何形态测量数据集。我对这个数据集的部分兴趣是生成一个数据框,其中包含重要地标之间的距离和地标向量之间的角度,在所有样本中具有同源坐标,以便进一步比较。点之间的距离不是问题,但是当我尝试计算每个样本的角度时,我遇到了问题。

我正在尝试找到一种方法来计算一次代表一系列样本上相同角度的线向量之间的角度(这些向量描述了一个具有生物学意义的特征,该特征存在于我的数据集中的所有样本中)。我用来处理形态测量数据的 R 包将地标输出为类的三维对象,array()其中行是地标,列是坐标的维度,第三维度是样本。以下是此处提供的样本数据中三个样本的地标坐标。

, , Specimen1

         X         Y
1  -0.2411  0.060183
2  -0.0677 -0.029954
3   0.1147  0.012111
4   0.0085  0.000462

, , Specimen2

          X       Y
1  -0.22509  0.0764
2  -0.09437 -0.0202
3   0.09135 -0.0182
4   0.00367 -0.0045

, , Specimen3

         X        Y
1  -0.2223  0.06122
2  -0.1001 -0.02366
3   0.0553  0.00577
4  -0.0617 -0.01557

下面是一个可读的数组,它复制了我作为前三个样本的输出获得的数据。

data<-array(data=c(-0.2411,-0.0677,0.1147,0.0085,0.060183,-0.029954,0.012111,0.000462,-0.22509,-0.09437,0.09135,0.00367,0.0764,-0.0202,-0.0182,-0.0045,-0.2223,-0.1001,0.0553,-0.0617,0.06122,-0.02366,0.00577,-0.01557),c(4,2,3))

我有兴趣找到由点 1 和 2 以及点 3 和 4 之间的线形成的角度。为此,我通过从另一个点的坐标减去一个点的坐标来计算这两条线的矢量。当我这样做时,我为每个向量得到一个 2*N 矩阵,其中行对应于 X 和 Y 轴上的向量,列对应于样本。

我想为样本 1(两个矩阵上的第 1 列)、2、3 等找到这两个向量之间的角度。理想情况下,我希望将输出转换为 R 报告每个样本的角度的格式,如下所示:

     Angle1
[,1] 146
[,2] 152
[,3] 135

然后以某种方式将其添加到数据框中,如下所示:

          Distance Angle1 Angle2
Specimen1 100      146    100
Specimen2 100      152    100
Specimen3 100      135    100

Angle2 的距离和值只是填充数字,以显示我想要实现的格式。

我尝试使用mathlib包中的angle()函数和Morpho包中的函数。这是我用来使用函数计算角度的代码。angle.calc()angle()

vector1<-data[1,,]-data[2,,]
vector2<-data[3,,]-data[4,,]
angle(as.vector(vector1),as.vector(vector2),degree=TRUE)

这些函数将计算看似准确的角度,但如果另有说明,它们只会对第一个样本或单个样本进行计算,并且不会为所有样本生成角度列表。我还检查了有关 Stack Overflow 的先前 问题,但给出的答案似乎都不适用于包含多个样本的数据集,两个矩阵上的每一列代表一个不同的样本(当我充其量应用它们时,它们似乎有同样的问题他们只返回第一个样本的角度)。这里只有三个标本,我在实际数据集中有大量标本和每个标本的多个角度,不可能单独测量每个标本的每个角度。

有没有办法编写一个公式来生成一个包含每个样本各自角度的列表?

标签: rgeometrytrigonometrycomputational-geometry

解决方案


首先,给2x3矩阵命名有点令人困惑vector1。除此之外,您可以matlib::angle用来计算角度。

library(matlib)
phi <- setNames(mapply(
    function(x1, x2) angle(x1, x2),
    as.data.frame(vector1), as.data.frame(vector2)),
    paste0("Specimen", 1:ncol(vector1)))
phi
#Specimen1 Specimen2 Specimen3
# 146.2674  152.4439  134.8753

说明:mapply用于同时迭代 和 的列vector1vector2这些列已转换为data.frames。用于stack将命名向量转换为 a data.frame

stack(phi)
#    values       ind
#1 146.2674 Specimen1
#2 152.4439 Specimen2
#3 134.8753 Specimen3

推荐阅读