2017-07-25 12 views
2

私は6000列の行列を持ち、各列は100個の "グループ"のうちの1つに属します。私はこの行列をリスト100のより小さな行列に変換する必要があります。これは私が持っているもののおもちゃの例である:マトリクスを列名で列挙するR

mat = cbind(c(2,2,2),c(3,3,3),c(4,4,4),c(1,1,1)) 
    colnames(mat) = c("2018.3 1","2018.3 2","2019.1 1","2019.2 2") 

ので、「グループ」は、各COLNAMEの最後の名前で識別され、ここでは2グループがあります。

list(cbind(c(2,2,2),c(4,4,4)),cbind(c(3,3,3),c(1,1,1))) 

私が考えてきたと私はそれがこのようなものであるべきだと思う:

lapply(do.call(cbind,sapply(something here to find the columns in each group))) 

が、私はそれを行う方法を正確に把握していない結果が、私は次のようになります必要があります。

答えて

0
#Obtain the last part of each column names 
groups = sapply(strsplit(x = colnames(mat), split = " "), function(x) x[2]) 

#Go through each unique column name and extract the corresponding columns 
lapply(unique(groups), function(x) mat[,which(groups == x)]) 
#[[1]] 
#  2018.3 1 2019.1 1 
#[1,]  2  4 
#[2,]  2  4 
#[3,]  2  4 

#[[2]] 
#  2018.3 2 2019.2 2 
#[1,]  3  1 
#[2,]  3  1 
#[3,]  3  1 

OR

lapply(split(1:NCOL(mat), sapply(strsplit(x = colnames(mat), split = " "), 
           function(x) x[2])), function(i) mat[,i]) 
#$`1` 
#  2018.3 1 2019.1 1 
#[1,]  2  4 
#[2,]  2  4 
#[3,]  2  4 

#$`2` 
#  2018.3 2 2019.2 2 
#[1,]  3  1 
#[2,]  3  1 
#[3,]  3  1 
+1

ます。また '行うことができグループ< - sapply(strsplit(X = COLNAMES(マット)、スプリット="「)、 '['、2) 'や'グループ< - gsub( "。*(\\ d +)$"、 "\\ 1"、colnames(mat)) ' – MrFlick

+1

@ dbに感謝します。 –

関連する問題