2013-10-31 212 views
2

我是一名硕士生,试图将R用于我的论文,但我对R非常陌生,我没有任何编程经验,所以请温柔!我尝试在{geomorph}包中使用一堆3D坐标数据来运行标准几何形态分析。为了方便起见,我已将数据拆分为更小的.csv文件。将二维矩阵转换为三维数组时出错R

我已经设置了数据文件的方式:

   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 

我导入至R使用read.table就好(尺寸​​为50×645),并且我甚至可以将所产生的数据帧分成矩阵使用as.matrix(保持50 x 645维度)。但是,当我使用arrayspecs {geomorph}将数据转换为数组(尺寸为215 x 3 x 50)时,我得到了超过50条警告,指出“数据长度不是数字的倍数或倍数行”。我一直在使用

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

但每次我运行此命令时,我得到了警告,“数据长度不是一个子多或行数的倍数。”我相信{geomorph}想在一个数据具有3列(X,Y,Z)和215行(坐标点的最大数量)的3D数组,找到实际解决此错误的参考(至少没有任何这是我可以理解的)。在此先感谢。

+0

我用一个随机50×645矩阵代码,并没有产生任何警告或错误:'垫< - 矩阵(runif(50 * 645 ),nrow = 50,ncol = 645)';昏暗(垫子)#[1] 50 645'; 'spec.mat < - arrayspecs(mat,215,3,byLand = F)'; dim(spec.mat)#[1] 215 3 50'。我猜想你的数据可能有问题,但由于你已经检查了他们的维度,所以我没有什么可以猜测的。 –

+0

谢谢!我最终在第一列中创建了非数字值,我试图创建行名,这是我的问题似乎已经出现的地方。我删除了这一栏,并安全地转移到了我的数据中。再次感谢! –

+0

将来可以避免在调用'read.table'时通过使用'row.names = 1'来删除应该是行名的第一列。参见'read.table'中的参数'row.names'。祝你好运! ;) –

回答

0

数组的维度只是一个ttribute。您可以去

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

取决于您的数据是如何安排的,什么其他的东西arrayspecs一样。

+0

这可能不会引发错误,但它也可能不会执行预期的操作。它可能会完全混淆50 x 645矩阵。用一个你知道顺序的5×12矩阵来尝试它,并将暗淡分配为'c(4,3,5)' –

1

矩阵或数组实际上是一个折叠向量,行是“第一维”。所以通过重新分配尺寸属性来“重新调整尺寸”是非常危险的。我想你需要先转置矩阵,如果你首先想要的645尺寸,这样你可以打破成215×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 
相关问题