我想创建一个矩阵,用于指示数据帧中的组成员身份。例如,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
答案 0 :(得分: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)
。