r - 如何计算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 的先前 问题,但给出的答案似乎都不适用于包含多个样本的数据集,两个矩阵上的每一列代表一个不同的样本(当我充其量应用它们时,它们似乎有同样的问题他们只返回第一个样本的角度)。这里只有三个标本,我在实际数据集中有大量标本和每个标本的多个角度,不可能单独测量每个标本的每个角度。
有没有办法编写一个公式来生成一个包含每个样本各自角度的列表?
解决方案
首先,给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
用于同时迭代 和 的列vector1
,vector2
这些列已转换为data.frame
s。用于stack
将命名向量转换为 a data.frame
:
stack(phi)
# values ind
#1 146.2674 Specimen1
#2 152.4439 Specimen2
#3 134.8753 Specimen3
推荐阅读
- nokogiri - 我无法在 JRUBY 上安装 Nokogiri
- android - 在没有root的情况下使用USB tethering时,如何从Android 11上的APP为我的手机设置静态IP地址?
- javascript - Cant find variable - parameter add function with firestore
- sql - BigQuery:包含多行的 UNNEST 结果
- html - 如何将弹出窗口放在叠加层上
- php - woocommerce 订阅在另一个地方添加续订按钮
- mongodb - 仅当不存在类似文档时才向 Mongo 插入新文档
- python - Json键值与文本文件属性匹配 - Python
- gitlab - 将域添加到管理区域中的出站请求时出现 Gitlab Omnibus 500 错误
- python - 使用正则表达式识别包含整个“名称”的文本行(更新问题)