2017-07-25 5 views
2

Ich habe eine Matrix mit 6000 Spalten und jede Spalte gehört zu einer von 100 "Gruppen" die ich brauche. Ich muss diese Matrix in eine Liste 100 kleinere Matrizen konvertieren. Dies ist ein Spielzeug Beispiel dafür, was ich habe:Matrix zur Liste der Matrixgruppe nach Spaltennamen in 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") 

so die „Gruppe“ durch den Nachnamen eines jeden colname identifiziert wird, hier gibt es zwei Gruppen. Das Ergebnis, das ich brauchen würde wie folgt aussehen:

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

Ich habe nachgedacht und ich denke, es ist so etwas wie dies sein sollte:

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

, aber ich habe nicht herausfinden, wie genau es zu tun.

Antwort

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 

ODER

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

könnten Sie auch tun 'Gruppen <- sapply (strsplit (x = COLNAMES (mat), Split =" „),' [ ', 2)' oder 'Gruppen < - gsub (". * (\\ d +) $", "\\ 1", Spaltennamen (Matte)) ' – MrFlick

+1

danke @db genau das, was ich brauchte. –

Verwandte Themen