我正在做一个具有二维笛卡尔坐标(即地标)的生物样本的几何形态计量数据集。我对这个数据集的兴趣之一是生成一个重要地标之间的距离和地标矢量之间的角度的数据框,这些数据在所有样本中均具有同源坐标,以供进一步比较。点之间的距离不是问题,但是当我尝试计算每个样本的角度时,我一直遇到问题。
我正在尝试找到一种方法来立即计算代表一系列样本上相同角度的线向量之间的角度(这些向量描述了具有生物学意义的特征,该特征存在于我的数据集中的所有样本中)。附件是x和y向量的数据集,该数据集是由四个地标构成的两个线段的样本,我感兴趣的是找到它们之间的角度,每列代表一个不同的样本。这是通过对用于分析数据的形态计量软件包生成的数组进行(dataset[landmark1,,]-dataset[landmark2,,]
来创建矢量时得到的格式。
vector1<-matrix(c(-0.1733,0.0901,-0.1307,0.0966,-0.1222,0.0849),nrow=2)
vector2<-matrix(c(0.1061591,0.0116495,0.0876752,-0.0137482,0.1170445,0.0213435),nrow=2)
我想找到样本1(两个矩阵的第1列),2、3等的vector1和vector2之间的夹角。理想情况下,我希望将输出格式转换为R报告每个个体样本的角度,如下所示:
[,1] [,2] [,3]
131 152 135
然后以某种方式将其添加到数据框中,使其看起来像这样:
Distance Angle
Specimen1 100 131
Specimen2 100 152
Specimen3 100 135
这些距离只是填充数字,以显示我想要实现的格式。
我已经尝试使用mathlib包中的angle()
函数和Morpho包中的angle.calc()
函数。但是,这些函数将仅计算第一个样本的角度,而不会生成所有样本的角度列表。我还检查了堆栈溢出的previous questions,但给出的答案似乎都不适用于包含多个样本的数据集,并且两个矩阵的每一列都代表一个不同的样本(当我应用它们时,它们不起作用此数据集)。我有大量标本,每个标本有多个角度,因此无法为每个标本单独测量每个角度。
是否有任何方法可以编写公式来生成包含每个标本各自角度的列表?
首先,给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
使用stack
将命名向量转换为data.frame
:
stack(phi)
# values ind
#1 146.2674 Specimen1
#2 152.4439 Specimen2
#3 134.8753 Specimen3