2017-07-25 222 views
2

我有一个矩阵6000列,每列属于我需要的100个“组”之一。我需要将这个矩阵转换成一个列表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正是我所需要的。 –