2015-02-10 71 views
0

我有一個數據幀vec,我需要準備一個image.plot()圖。的vec的結構如下:R:用值填充矩陣不起作用

> str(vec) 
'data.frame': 31212 obs. of 5 variables: 
$ x : int 8 24 40 56 72 88 104 120 136 152 ... 
$ y : int 8 8 8 8 8 8 8 8 8 8 ... 
$ dx: num 0 0 0 0 0 0 0 0 0 0 ... 
$ dy: num 0 0 0 0 0 0 0 0 0 0 ... 
$ d : num 0 0 0 0 0 0 0 0 0 0 ... 

注:$dx$dy$d的值不是零,而是隻有太小本概述中顯示。

背景:數據是像素跟蹤軟件的輸出。 $ x和$ y是像素座標,而$ d是該像素的位移矢量長度(以像素爲單位)。

image.plot()期望作爲第一和第二個參數的矩陣作爲有序向量的維數,所以我認爲sort(unique(vec$x))sort(unique(vec$y))分別應該是好的。所以,我想結束image.plot(sort(unique(vec$x)),sort(unique(vec$y)), data)

第三個參數是實際數據。爲了建立這個我試過了:

# spanning an empty matrix 
data = matrix(NA,length(unique(vec$x)),length(unique(vec$y))) 
# filling the matrix 
data[match(vec$x, sort(unique(vec$x))), match(vec$y, sort(unique(vec$y)))] = vec$d 

但是,不幸的是,這是行不通的。它報告沒有錯誤,但data不包含任何值!此作品:

for(i in c(1:length(vec$x))) data[match(vec$x[i], sort(unique(vec$x))), match(vec$y[i], sort(unique(vec$y)))] = vec$d[i] 

但是速度很慢。

a)有沒有更好的方法來構建data

b)有沒有更好的方法來處理我的問題,反正呢?

回答

3

R允許通過兩列矩陣對矩陣進行索引,其中索引的第一列被解釋爲行索引,第二列被列爲列索引。所以,創建索引到的數據爲兩列的矩陣

idx = cbind(match(vec$x, sort(unique(vec$x))), 
      match(vec$y, sort(unique(vec$y)))) 

,並使用該

data[idx] = vec$d 
+0

只是爲了澄清,當時該指數'idx'是一個矩陣,矩陣中的行被解釋爲位置在被分配的矩陣中。當您使用兩個索引變量(即'data [a,b] < - x')時,''將'a'指定的行與'b'指定的列相交。 – Jthorpe 2015-02-10 17:31:30

+0

@Jthorpe是的,沒錯。對於m =矩陣(0,5,5),比較m [cbind(c(1,3),c(2,4))] = 1'和m [c(1,3),c (2,4)]';你對前者感興趣。 – 2015-02-10 17:36:37

+0

@Martin Morgan:這個工作非常出色!非常感謝你。它太快了! – agoldev 2015-02-10 17:40:01