2

我是一名硕士生,试图在我的论文中使用 R,但我对 R 非常陌生,而且我没有任何编程经验,所以请温柔!我有一堆 3D 坐标数据,我试图在 {geomorph} 包中使用它们来运行标准几何形态分析。为方便起见,我将数据拆分为较小的 .csv 文件。

我以以下方式设置了数据文件:

             X1  - Y1 - Z1  - X2 - Y2 - Z2 - … - Z215
[Indiv.1]    323 - 87 - 68 - 323 - 87 - 68 -   -  0

[Indiv.2]    363 - 88 - 81 - 363 - 88 - 81 -   - 77

[Indiv.3]    335 - 77 - 70 - 335 - 77 - 70 -   -  0

[Indiv.4]    359 - 71 - 81 - 359 - 71 - 81 -   -  0

  … 

[Indiv.50]   366 - 71 - 92 - 367 - 72 - 91 -   -  0

read.table我使用很好(尺寸为 50 x 645)导入到 R ,我什至可以使用as.matrix(保持 50 x 645 尺寸)将生成的数据框转换为矩阵。但是,当我使用 {geomorph} 将数据转换为数组(尺寸 215 x 3 x 50)arrayspecs时,我收到超过 50 条警告说“数据长度不是行数的子倍数或倍数”。我一直在使用

> WM.array<-arrayspecs(WM.mat,215,3,byLand=F)

但是每次我运行这个命令时,我都会收到警告“数据长度不是行数的子倍数或倍数”。我相信 {geomorph} 想要一个 3D 数组中的数据,其中包含 3 列(X、Y、Z ) 和 215 行(最大坐标点数),第三维是 50 个人。

任何有关解决此问题的帮助将不胜感激,因为我找不到实际解决此错误的参考资料(至少没有一个我可以理解的参考资料)。提前致谢。

4

2 回答 2

1

矩阵或数组实际上是折叠向量,行是“第一维”。所以仅仅通过重新分配维度属性来“重新维度”是非常危险的。如果您首先想要 645 维度,我认为您需要先转置该矩阵,以便您可以通过分成 215 x 3 段来重新调整它的维度:试试这个:

 WM.array<-t( WM.mat)
 dim( WM.array) <- c(215, 3, 50)

另一种方法是使用该功能aperm

 WM.array<- WM.mat)
 dim( WM.array) <- c(50, 215, 3)    
 WM.array <- aperm(WM.array, c(2,3,1) )

的第二个参数aperm是编号旧尺寸的新顺序。与往常一样,您应该使用小型测试对象:

arr <- array(1:(2*3*4), c(2,3,4) )
arr
mat <- matrix(1:(2*3*4), 2)
mat
于 2013-10-31T23:23:11.497 回答
0

数组的维数只是一个属性。你也许可以去

dim(WM.mat) <- c(215, 3, 50)

取决于您的数据的排列方式以及其他操作arrayspecs

于 2013-10-31T23:17:45.917 回答