0

R は初めてで、長い質問があります。

シェープファイル/マップがあり、そのポリゴンとそれに隣接する各ポリゴンの属性に基づいて、そのマップ内のすべてのポリゴンの特定のインデックスを計算することを目指しています。

私は隣接行列を持っています - これは「1次クイーン隣接重み行列」と同じだと思いますが、よくわかりませんが、どのポリゴンが他のどのポリゴンと国境を接しているかを説明しています。

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' に隣接していることを示しています。ポリゴン 'B' はポリゴン 'C' のみに隣接します。

私が持っている属性テーブルには、行ごとに 1 つのポリゴンがあります。

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

ここで、TOT、L10K などは、インデックスの計算に使用する変数です。

データには 525 のポリゴン/行があるため、隣接行列を使用して、関心のあるインデックスの計算に組み込む行の属性を決定したいと考えています。今のところ、隣接するポリゴンの 1 つの「バンドル」に対応する行をサブセット化し、ループを使用してインデックスを計算できます (興味がある場合は、地元の所得分離の尺度である Centile Gap Index を計算しています)。 )。たとえば、デトロイト市立学校の「近隣」をサブセット化すると、次のようになります。

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 は、属性テーブルで必要なものです。

次に、次のコードを使用してインデックスを計算します。デトロイトのサブセットには 19 個のポリゴンがあるため、ループに「i in 1: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を初めて使用します。

編集:

私はそれ以来、これにアプローチする方法を考え出しましたが、問題を明確にするために、またコメントで尋ねられた 1 つの質問に答えるために、ポリゴンの近隣は、それ自体と隣接するすべてのポリゴンの結合であると言いましょう。上記の例では、ポリゴン「A」の場合、ポリゴンの「A」、「C」、および「E」の結合になります。

4

2 に答える 2

2

補助マトリックスをどのように活用するかは明確ではありません。

1つのアイデアは、問題をグラフとして定式化することです。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)

ここに画像の説明を入力してください

ここで、属性マトリックスを使用して、各エッジの属性を作成します(各行はエッジであるため)

#ダミーの属性マトリックスを作成します

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オプションを使用して各ノードの情報を取得できます。例:

e。Bに隣接するポリゴンのL10K属性を取得します

V(g)[get.adjlist(g,'out')$B]$L10K
[1] 26

ここでは、プライオゴンAに隣接するすべてのポリゴンのTOTの合計を計算します。

 sum(V(g)[get.adjlist(g,'out')$A]$TOT)
  400
于 2012-12-14T05:01:03.277 に答える
0

@agstudy ほどエレガントではないように見えますが、これは私がやったことです:

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

など、それにより、後続の計算を実行するための隣接するポリゴンのフレームを作成します

于 2012-12-17T18:59:24.563 に答える