2014-10-05 57 views
0

块对角数据帧我有一个数据组,看起来像这样:创建中的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中做到这一点?

+1

你能在第一个数据集如何与第二阐述。 – jdharrison 2014-10-05 18:33:01

回答

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 
2

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

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