2017-07-25 279 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正是我所需要的。 –