在R中按列名将矩阵转换为列表的矩阵分组

3

我有一个矩阵,它有6000列,每一列都属于100个所需的“组”之一。我需要将这个矩阵转换为包含100个较小矩阵的列表。以下是我拥有的示例:

  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")

所以“组”由每个列名的姓氏识别,这里有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)))

但我还没有确切地想到如何做到这一点。
1个回答

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

或者

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
你也可以使用以下代码进行操作:groups <- sapply(strsplit(x = colnames(mat), split = " "), [, 2) 或者 groups <- gsub(".*(\\d+)$","\\1", colnames(mat)) - MrFlick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接