2016-05-03 22 views
3

データフレームからグループメンバーシップを示すマトリックスを作成したいと思います。たとえば、NxN行列は1が近傍を意味し、0は別の近傍と同じ都市内にあり、0は近傍が異なる都市の一部であることを意味します。たとえば:グループメンバーシップに基づいてマトリックスを作成してください。

hoodid <- c(1:10) 
cityid <- c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3) 
df <- data.frame(hoodid, cityid) 
df 

# hoodid cityid 
# 1  1  1 
# 2  2  1 
# 3  3  1 
# 4  4  2 
# 5  5  2 
# 6  6  3 
# 7  7  3 
# 8  8  3 
# 9  9  3 
# 10  10  3 

望ましい結果は次のとおりです。

# 0 1 1 0 0 0 0 0 0 0 
# 1 0 1 0 0 0 0 0 0 0 
# 1 1 0 0 0 0 0 0 0 0 
# 0 0 0 0 1 0 0 0 0 0 
# 0 0 0 1 0 0 0 0 0 0 
# 0 0 0 0 0 0 1 1 1 1 
# 0 0 0 0 0 1 0 1 1 1 
# 0 0 0 0 0 1 1 0 1 1 
# 0 0 0 0 0 1 1 1 0 1 
# 0 0 0 0 0 1 1 1 1 0 
+1

この種類のもののために設計されたigraphパッケージに興味があるかもしれません – Frank

+0

igraphのどの部分が助けになるかということについて、これ以上の手がかりを与えることはできますか? – bcrew

+0

'from_adjacency'はあなたの隣接行列をグラフに変換します。そこから、このようなデータの分析に通常使用されるグラフアルゴリズムを利用できます。 – Frank

答えて

5

これは動作します:

library(Matrix) 
m = do.call(bdiag, lapply(
    lengths(split(df$cityid, df$cityid)), 
    function(n) 1 - diag(n) 
)) 

# 10 x 10 sparse Matrix of class "dgCMatrix" 
#       
# [1,] . 1 1 . . . . . . . 
# [2,] 1 . 1 . . . . . . . 
# [3,] 1 1 . . . . . . . . 
# [4,] . . . . 1 . . . . . 
# [5,] . . . 1 . . . . . . 
# [6,] . . . . . . 1 1 1 1 
# [7,] . . . . . 1 . 1 1 1 
# [8,] . . . . . 1 1 . 1 1 
# [9,] . . . . . 1 1 1 . 1 
# [10,] . . . . . 1 1 1 1 . 

これはあなたのデータはcityid最初でソートされ、重複またはいずれかを持っていないことを前提としてい他の奇妙な。

バニラマトリックスが必要な場合はas.matrix(m)とすることができます。

+1

優れています。 cityid(グループ変数)を最初にソートすることを前提としています。ありがとう! – bcrew

関連する問題