如何从R中的网格坐标创建邻接矩阵?

时间:2013-04-18 05:36:53

标签: r coordinates coordinate adjacency-matrix

我是这个网站的新手。我想知道是否有人有翻转网格坐标列表的经验(下面的示例代码显示为df)。我编写了一个可以处理非常小的数据集的工作的函数,但随着数据集大小的增加,运行时间呈指数级增长(我认为800像素大约需要25个小时)。这是因为嵌套的for循环,但我不知道如何绕过它。

## Dummy Data
x <- c(1,1,2,2,2,3,3)
y <- c(3,4,2,3,4,1,2)
df <- as.data.frame(cbind(x,y))
df

## Here's what it looks like as an image
a <- c(NA,NA,1,1)
b <- c(NA,1,1,1)
c <- c(1,1,NA,NA)
image <- cbind(a,b,c)
f <- function(m) t(m)[,nrow(m):1]
image(f(image))

## Here's my adjacency matrix function that's slowwwwww
adjacency.coordinates <- function(x,y) {
  df <- as.data.frame(cbind(x,y))
  colnames(df) = c("V1","V2")
  df <- df[with(df,order(V1,V2)),]
  adj.mat <- diag(1,dim(df)[1])
  for (i in 1:dim(df)[1]) {
    for (j in 1:dim(df)[1]) {
      if((df[i,1]-df[j,1]==0)&(abs(df[i,2]-df[j,2])==1) | (df[i,2]-df[j,2]==0)&(abs(df[i,1]-df[j,1])==1)) {
        adj.mat[i,j] = 1
      }
    }
  }
  return(adj.mat)
}

## Here's the adjacency matrix
adjacency.coordinates(x,y)

有没有人知道这样做的方法可以在一组几千像素长的坐标上运行良好?我已经尝试过转换到SpatialGridDataFrame并从那里开始,但它不会使邻接矩阵正确。非常感谢你的时间。

1 个答案:

答案 0 :(得分:4)

虽然我认为igraph可能是去这里的方式,但我认为你可以更简单地这样做:

result <- apply(df, 1, function(pt) 
  (pt["x"] == df$x &  abs(pt["y"] - df$y) == 1) |
  (abs(pt["x"] - df$x) == 1 &  pt["y"] == df$y)    
)
diag(result) <- 1

避免循环并获得相同的结果:

> identical(adjacency.coordinates(x,y),result)
[1] TRUE