これが問題です。N 行と C 列、および 2 つの因子を持つ行列があります:ids
とgroup
、どちらも長さ N です。例:
m <- matrix( 1:25, nrow= 5, byrow= T )
id <- factor( c( "A", "A", "A", "B", "B" ) )
group <- factor( c( "a", "b", "c", "a", "c" ) )
すべての要因の組み合わせが存在するわけではありませんが、要因の各組み合わせは 1 回しか存在しません。タスクは、行と列m
を持つように行列を変換することです。つまり、各変数が元の列と factor のすべての可能なレベルの組み合わせに対応する行列を作成します。欠損値 (id とグループの組み合わせが存在しない場合) は、NA に置き換えられます。上記の例の望ましい出力は次のとおりです。length( levels( id ) )
length( levels( group ) ) * C
group
a.1 a.2 a.3 a.4 a.5 b.1 b.2 b.3 b.4 b.5 c.1 c.2 c.3 c.4 c.5
A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
B 16 17 18 19 20 NA NA NA NA NA 21 22 23 24 25
私は自分の関数を書きましたが、それはひどく効果がなく、非常に単純なものの機能を複製していると確信しています。
matrixReshuffle <- function( m, ids.row, factor.group ) {
nr <- nrow( m )
nc <- ncol( m )
if( is.null( colnames( m ) ) ) colnames( m ) <- 1:nc
ret <- NULL
for( id in levels( ids.row ) ) {
r <- c()
for( fg in levels( factor.group ) ) {
d <- m[ ids.row == id & factor.group == fg,, drop= F ]
if( nrow( d ) > 1 )
stop( sprintf( "Too many matches for ids.row= %s and factor.group= %s", id, fg ) )
else if( nrow( d ) < 1 ) {
r <- c( r, rep( NA, nc ) )
} else {
r <- c( r, d[1,] )
}
}
ret <- rbind( ret, r )
}
colnames( ret ) <- paste( rep( levels( factor.group ), each= nc ), rep( colnames( m ), length( levels( factor.group ) ) ), sep= "." )
rownames( ret ) <- levels( ids.row )
return( ret )
}