【问题标题】:Create matrix based upon group membership根据组成员创建矩阵
【发布时间】:2016-05-03 16:08:51
【问题描述】:

我想创建一个矩阵来指示来自数据框的组成员身份。例如,一个 NxN 矩阵,其中 1 表示一个社区与另一个社区在同一个城市内,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

【问题讨论】:

  • 你可能对 igraph 包感兴趣,专为这类事情设计
  • 您能否提供更多线索来说明 igraph 的哪个部分会有所帮助?
  • from_adjacency 会将您的邻接矩阵转换为图形。从那里,您可以利用通常用于分析此类数据的图形算法。
  • 我也会调查的。感谢弗兰克的帮助。
  • 您可能会发现this post 也很有帮助; tcrossprod(table(df))

标签: r matrix


【解决方案1】:

这行得通:

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)

【讨论】:

  • 优秀。这是正确的,假设首先对 cityid (组变量)进行排序。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多