2013-10-31 247 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 
相關問題