我有一个数据框vec
,我需要为image.plot()
绘图做准备。 vec
的结构如下:
> 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)有没有更好的方法来处理我的问题呢?
答案 0 :(得分:3)
R允许通过两列矩阵索引矩阵,其中索引的第一列被解释为行索引,第二列被解释为列索引。因此,将索引创建为数据为两列矩阵
idx = cbind(match(vec$x, sort(unique(vec$x))),
match(vec$y, sort(unique(vec$y))))
并使用
data[idx] = vec$d