在R中创建块对角线数据帧

时间:2014-10-05 18:27:01

标签: r

我有一个如下所示的数据集:

Person  Team
 114    1
 115    1
 116    1
 117    1
 121    1
 122    1
 123    1
 214    2
 215    2
 216    2
 217    2
 221    2
 222    2
 223    2

“团队”的范围从1到33,团队的规模不同(即,可以有5,6或7名成员,具体取决于团队)。我需要创建一个看起来像这样的数据集:

1   1   1   1   1   1   1   0   0   0   0   0   0   0
1   1   1   1   1   1   1   0   0   0   0   0   0   0
1   1   1   1   1   1   1   0   0   0   0   0   0   0
1   1   1   1   1   1   1   0   0   0   0   0   0   0
1   1   1   1   1   1   1   0   0   0   0   0   0   0
1   1   1   1   1   1   1   0   0   0   0   0   0   0
1   1   1   1   1   1   1   0   0   0   0   0   0   0
0   0   0   0   0   0   0   1   1   1   1   1   1   1
0   0   0   0   0   0   0   1   1   1   1   1   1   1
0   0   0   0   0   0   0   1   1   1   1   1   1   1
0   0   0   0   0   0   0   1   1   1   1   1   1   1
0   0   0   0   0   0   0   1   1   1   1   1   1   1
0   0   0   0   0   0   0   1   1   1   1   1   1   1
0   0   0   0   0   0   0   1   1   1   1   1   1   1

各个区块的大小由团队中的人数决定。我怎么能在R?中做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以使用包bdiag中的Matrix。例如:

> bdiag(matrix(1,ncol=7,nrow=7),matrix(1,ncol=7,nrow=7))

答案 1 :(得分:1)

另一个想法,虽然,我想这比RStudent的效率/优雅要低:

DF = data.frame(Person = sample(100, 21), Team = rep(1:5, c(3,6,4,5,3)))
DF

lengths = tapply(DF$Person, DF$Team, length)
mat = matrix(0, sum(lengths), sum(lengths))
mat[do.call(rbind, 
            mapply(function(a, b) arrayInd(seq_len(a ^ 2), c(a, a)) + b, 
                   lengths, cumsum(c(0, lengths[-length(lengths)])), 
                   SIMPLIFY = F))] = 1
mat