2017-02-24 23 views
0

我將熱圖像轉換爲R 480×640矩陣。在隔離我的「信號」(在一個字段中的幼苗)之後,我想導出值爲data.table,同時還記錄每個觀測的行和列。我需要一個基本x,y,z信息的最終data.table。我在rgl中將原始熱矩陣繪製爲3D表面,並且想要在渲染中製作另一個3D圖層來說明我的「信號」。如何從3D渲染矩陣中提取和記錄值以及它們各自的列/行信息?

於是我開始示例數據如下:

library(data.table) 
library(rgl) 

dd <- data.table(c(1,0,1,2,1,0,2,1,0,2), 
       c(0,1,2,1,3,2,4,1,2,0), 
       c(3,2,1,3,2,4,3,2,1,0), 
       c(2,1,0,2,1,3,2,3,1,1), 
       c(0,1,2,1,3,2,0,1,1,3)) 

bb <- as.matrix(dd) # save a copy for later 

find_signal = function(DT, max, min) { # inverse of Dowle's NA remover 
    for (j in seq_len(ncol(DT))) 
    set(DT,which(DT[[j]] < min),j,NA) 
    for (j in seq_len(ncol(DT))) 
    set(DT,which(DT[[j]] > max),j,NA) 
} 

find_signal(dd, 2.0001, 1.9999) 

所以現在,消除「噪音」之後,我data.table只包含關聯到我的「信號」的價值觀。在這一點上它看起來像這樣:

V1 V2 V3 V4 V5 
1: NA NA NA 2 NA 
2: NA NA 2 NA NA 
3: NA 2 NA NA 2 
4: 2 NA NA 2 NA 
5: NA NA 2 NA NA 
6: NA 2 NA NA 2 
7: 2 NA NA 2 NA 
8: NA NA 2 NA NA 
9: NA 2 NA NA NA 
10: 2 NA NA NA NA 

我正在制定出如何導出這些值,同時記錄它們在熱圖像中的相應位置。我需要將每個觀察值以及相應的行和列信息導出到另一個data.table。這樣做的目的是渲染rgl場景中的其他圖層並進行進一步分析,如歐幾里得距離計算。

假設的輸出如下:

y <- c(1,2,3,4,5,1,2,3,4,5,1,2,3,4) 
x <- c(10,9,8,7,6,7,6,5,4,3,4,3,2,1) 
z <- c(2,2,2,2,2,2,2,2,2,2,2,2,2,2) 

aa <- data.table(x,y,z) 

而且應該是這樣的:

 x y z 
1: 10 1 2 
2: 9 2 2 
3: 8 3 2 
4: 7 4 2 
5: 6 5 2 
6: 7 1 2 
7: 6 2 2 
8: 5 3 2 
9: 4 4 2 
10: 3 5 2 
11: 4 1 2 
12: 3 2 2 
13: 2 3 2 
14: 1 4 2 

讓我創造這樣一個用下面的代碼呈現的rgl場景:

xb <- c(1:nrow(bb)); yb <- c(1:ncol(bb)) 

persp3d(x= xb, y= yb, z= bb, col = "blue")+ 
lines3d(aa$x[1:5], aa$y[1:5], z= z+1, col = "green", lwd = 5)+ # my signal 
lines3d(aa$x[6:10], aa$y[6:10], z= z+1,col = "green", lwd = 5)+ 
lines3d(aa$x[11:14], aa$y[11:14], z= z+1, col = "green", lwd = 5) 

同樣,我如何導出值從一個data.table(或矩陣),同時記錄每個值的列和行號?

感謝意見

+0

這些可能會有所幫助:http://stackoverflow.com/questions/10555210/r-convert-matrix-or-data-frame-to-sparsematrix和http://stackoverflow.com/questions/21099612/extract- i-and-j-from-a-sparse-matrix – chinsoon12

+0

@ chinsoon12謝謝...鏈接的內容看起來很有前途 –

回答

1

您可以通過使用row()col()功能找到矩陣的每個條目的索引。因此,對於你的例子:

keep <- !is.na(bb) 
cbind(x = row(bb)[keep], y = col(bb)[keep], z = bb[keep] ) 

產生這樣的輸出:

 x y z 
[1,] 4 1 2 
[2,] 7 1 2 
[3,] 10 1 2 
[4,] 3 2 2 
[5,] 6 2 2 
[6,] 9 2 2 
[7,] 2 3 2 
[8,] 5 3 2 
[9,] 8 3 2 
[10,] 1 4 2 
[11,] 4 4 2 
[12,] 7 4 2 
[13,] 3 5 2 
[14,] 6 5 2 

這不是你要求的順序;如果有問題,請使用order()