根据组成员身份创建矩阵

bcr*_*rew 3 r matrix

我想创建一个矩阵,指示数据帧中的组成员身份.例如,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
Run Code Online (Sandbox Code Playgroud)

期望的结果是:

# 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
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 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 .
Run Code Online (Sandbox Code Playgroud)

这假定您的数据首先排序,cityid没有重复或任何其他奇怪的数据.

as.matrix(m)如果你想要一个香草矩阵,你可以.