如何使用邻接矩阵来确定哪些行“传递”到r中的函数?

时间:2012-12-14 01:29:58

标签: r loops spatial

R的新手,我有一个长期存在的问题:

我有一个shapefile / map,我的目标是根据该多边形的属性和与之相邻的每个多边形为该地图中的每个多边形计算某个索引。

我有一个邻接矩阵 - 我认为它与“一阶皇后邻接权重矩阵”相同,虽然我不确定 - 它描述了哪些多边形与哪些其他多边形边界,例如

POLYID A B C D E  
    A  0 0 1 0 1  
    B  0 0 1 0 0    
    C  1 1 0 1 0     
    D  0 0 1 0 1     
    E  1 0 0 1 0

以上表示,例如,多边形'C'和'E'邻接多边形'A'; polygon'B'仅与多边形“C”相邻,等等。

我拥有的属性表每行有一个多边形:

POLYID TOT L10K 10_15K 15_20K ...  
     A 500   24     30     77 ...

其中TOT,L10K等是我用来计算指数的变量。

我的数据中有525个多边形/行,因此我想使用邻接矩阵来确定要将哪些行的属性合并到感兴趣的索引的计算中。现在,我可以计算索引,当我对与相邻多边形的一个“束”对应的行进行子集化,然后使用循环(如果感兴趣,我正在计算百分比差距指数,衡量当地收入分离)。例如,将底特律城市学校的“邻域”分类:

Detroit <- UNSD00[c(142,150,164,221,226,236,295,327,157,177,178,364,233,373,418,424,449,451,487),]

然后记录边际列比例和运行总计:

catprops <- vector()
for(i in 4:19)
{
  catprops[(i-3)]<-sum(Detroit[,i])/sum(Detroit[,3])
}
catprops <- as.data.frame(catprops)
catprops[,2]<-cumsum(catprops[,1])

第4:19列是属性表中必需的。

然后我使用以下代码计算索引 - 注意循环具有“i in 1:19”,因为Detroit子集有19个多边形。

cgidistsum <- 0
for(i in 1:19)
{  
   pranks <- vector()
   for(j in 4:19)
    {
      if (Detroit[i,j]==0)
        pranks <- append(pranks,0)
      else if (j == 4)
      pranks <- append(pranks,seq(0,catprops[1,2],by=catprops[1,2]/Detroit[i,j]))
      else 
        pranks <- append(pranks,seq(catprops[j-4,2],catprops[j-3,2],by=catprops[j-3,1]/Detroit[i,j]))
    }
  distpranks <- vector()
  distpranks<-abs(pranks-median(pranks))
  cgidistsum <- cgidistsum + sum(distpranks)
  }
cgi <- (.25-(cgidistsum/sum(Detroit[,3])))/.25

如果我提供的信息超出了必要的数量,我表示歉意。我真的想利用邻接矩阵来计算这些行的每个“束”的CGI。

如果你碰巧知道如何开始这个,那就太好了。

我为任何新手的错误道歉,我是R的新手!

编辑:

我已经想出如何处理这个问题,但为了清楚问题并回答评论中提到的一个问题,让我说多边形的邻域是它自身和它相邻的每个多边形的联合至。在上面我给出的例子中,对于多边形'A',这将是多边形'A','C'和'E'的并集

2 个答案:

答案 0 :(得分:2)

目前尚不清楚如何利用附属矩阵。

一个想法是将您的问题表示为图形问题。 igraph适合操纵相邻的边和顶点。

这是我的想法:

# I read the adjency matrix
POLYID.adjency <- read.table(text ='A B C D E  
A  0 0 1 0 1  
B  0 0 1 0 0    
C  1 1 0 1 0     
D  0 0 1 0 1     
E  1 0 0 1 0',header = TRUE)
# I create the graph
require(igraph)
g <- graph.adjacency(adjmatrix=POLYID.adjency)
V(g)$label <- V(g)$name

作为选项,您可以绘制它:

 plot(g)

enter image description here

现在我使用属性矩阵为每条边创建一个属性(因为每一行都是一条边)

#I创建一个虚拟属性矩阵

POLYID.attributes <- read.table(text =' TOT L10K 10_15K 15_20K 
A 500   24     30     77
B 400   25     30     87
C 300   26     30     97
D 200   27     30     57
E 100   28     30     47',header = TRUE)

# I set the attributes
for(x in colnames(POLYID.attributes)){
   g <- set.vertex.attribute(g, name = x,
                         value=  POLYID.attributes[,x])

  }

现在所有问题信息都在图表中。

str(g)
IGRAPH DN-- 5 10 -- 
+ attr: name (v/c), label (v/c), TOT (v/n), L10K (v/n),
        X10_15K (v/n), X15_20K (v/n)
+ edges (vertex names):
 [1] A->C A->E B->C C->A C->B C->D D->C D->E E->A E->D

现在我可以使用igraph选项获取每个节点的信息,例如:

即获取与B

相邻的多边形的L10K属性
V(g)[get.adjlist(g,'out')$B]$L10K
[1] 26

这里我计算了与plyogon A相邻的所有多边形的TOT总和:

 sum(V(g)[get.adjlist(g,'out')$A]$TOT)
  400

答案 1 :(得分:0)

这就是我最终要做的事情,虽然它看起来并不像@agstudy那样优雅:

for(k in 1:nrow(adjacency00))
 {
  positions <- grep(1,adjacency00[k,])-1
  nghbrd <- UNSD00[c(positions,k),]

等,从而创建一个相邻多边形的框架,在其上进行后续计算