waxattax
waxattax

Reputation: 357

Create block diagonal data frame in R

I have a data set that looks like this:

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

"Team" ranges from 1 to 33, and teams vary in terms of size (i.e., there can be 5, 6, or 7 members, depending on the team). I need to create a data set into something that looks like this:

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

The sizes of the individual blocks are given by the number of people in a team. How can I do this in R?

Upvotes: 0

Views: 257

Answers (2)

alexis_laz
alexis_laz

Reputation: 13122

Another idea, although, I guess this is less efficient/elegant than RStudent's:

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

Upvotes: 1

DatamineR
DatamineR

Reputation: 9618

You could use bdiag from the package Matrix. For example:

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

Upvotes: 2

Related Questions