按列名拆分R中的矩阵

按列名拆分R中的矩阵,r,R,我有一个由6列组成的矩阵,如: c_1 C_2 A_1 A_2 D_1 D_2 .. 2 3 3 3 3 3 3 4 4 4 4 2 2 2 我想打破这三个前缀相同的矩阵: c_1 c_2 2 3 4 4 A_1 A_2 3 3 4 4 假设矩阵中的混合大小写c是一个打字错误,类似这样的东西应该可以工作: m <- matrix(1:12,2,6) colnames(m) <- paste(rep(letters[1:3],each = 2),

我有一个由6列组成的矩阵,如:

c_1 C_2 A_1 A_2 D_1 D_2 ..
 2  3  3  3  3  3  3
 4  4  4  4  2  2  2
我想打破这三个前缀相同的矩阵:

c_1 c_2
2  3
4  4

A_1 A_2
3 3
4 4 

假设矩阵中的混合大小写c是一个打字错误,类似这样的东西应该可以工作:

m <- matrix(1:12,2,6)
colnames(m) <- paste(rep(letters[1:3],each = 2),1:2,sep = '_')
out <- split.data.frame(t(m),f = substr(rownames(t(m)),1,1))
out <- lapply(out,t)
> out
$a
     a_1 a_2
[1,]   1   3
[2,]   2   4

$b
     b_1 b_2
[1,]   5   7
[2,]   6   8

$c
     c_1 c_2
[1,]   9  11
[2,]  10  12

假设矩阵中的混合大小写c是一个打字错误,类似这样的东西应该可以工作:

m <- matrix(1:12,2,6)
colnames(m) <- paste(rep(letters[1:3],each = 2),1:2,sep = '_')
out <- split.data.frame(t(m),f = substr(rownames(t(m)),1,1))
out <- lapply(out,t)
> out
$a
     a_1 a_2
[1,]   1   3
[2,]   2   4

$b
     b_1 b_2
[1,]   5   7
[2,]   6   8

$c
     c_1 c_2
[1,]   9  11
[2,]  10  12

这取决于你到底想做什么。以下是几个例子:

mat <- structure(c(3L, 4L, 3L, 4L, 3L, 4L, 3L, 2L, 3L, 2L, 3L, 2L), 
                 .Dim = c(2L,6L), 
                 .Dimnames = list(c("2", "4"), c("c_1", "c_2", "A_1", "A_2","D_1", "D_2")))
如果要根据列名称的第一个字母执行此操作,可以手动选择所需的列名称:

mat[,substr(colnames(mat), 1, 1)=="A"]
或者,您可以获得一个包含所有可能列名称的列表

lst <- lapply(unique(substr(colnames(mat),1,1)), 
          function(x) mat[,substr(colnames(mat), 1, 1)==x])
names(lst) <- unique(substr(colnames(mat),1,1))
lst

这取决于你到底想做什么。以下是几个例子:

mat <- structure(c(3L, 4L, 3L, 4L, 3L, 4L, 3L, 2L, 3L, 2L, 3L, 2L), 
                 .Dim = c(2L,6L), 
                 .Dimnames = list(c("2", "4"), c("c_1", "c_2", "A_1", "A_2","D_1", "D_2")))
如果要根据列名称的第一个字母执行此操作,可以手动选择所需的列名称:

mat[,substr(colnames(mat), 1, 1)=="A"]
或者,您可以获得一个包含所有可能列名称的列表

lst <- lapply(unique(substr(colnames(mat),1,1)), 
          function(x) mat[,substr(colnames(mat), 1, 1)==x])
names(lst) <- unique(substr(colnames(mat),1,1))
lst
尝试以下方法:

library(stringr)
spl <- read.table(header=TRUE, text='
c_1 C_2 A_1 A_2 D_1 D_2 ..
2  3  3  3  3  3  3
4  4  4  4  2  2  2')
spl
names(spl) <- lapply(names(spl), tolower) # not sure if you want "c_1" w/ "C_2"
lapply(split(data.frame(t(spl)), str_extract(names(spl), "[A-Za-z]")), t)
# $a
# a_1 a_2
# X1   3   3
# X2   4   4
# 
# $c
# c_1 c_2
# X1   2   3
# X2   4   4
# 
# $d
# d_1 d_2
# X1   3   3
# X2   2   2

#or
lapply(split(data.frame(t(spl)), substr(names(spl), 1, 1)), t) # includes ".."
尝试以下方法:

library(stringr)
spl <- read.table(header=TRUE, text='
c_1 C_2 A_1 A_2 D_1 D_2 ..
2  3  3  3  3  3  3
4  4  4  4  2  2  2')
spl
names(spl) <- lapply(names(spl), tolower) # not sure if you want "c_1" w/ "C_2"
lapply(split(data.frame(t(spl)), str_extract(names(spl), "[A-Za-z]")), t)
# $a
# a_1 a_2
# X1   3   3
# X2   4   4
# 
# $c
# c_1 c_2
# X1   2   3
# X2   4   4
# 
# $d
# d_1 d_2
# X1   3   3
# X2   2   2

#or
lapply(split(data.frame(t(spl)), substr(names(spl), 1, 1)), t) # includes ".."

看一下split并使用substr按colname的第一个字母进行拆分。两者都使用split。相关:查看拆分,并使用substr按colname的第一个字母拆分。两者都使用split。相关:+1您可以使用tolower来确保ColName匹配。我是这样使用regmatches和regexpr的:regmatches colnamesm,regexpr[a-z],tolower colnamesm+1您可以使用tolower来确保colnames匹配。我是这样使用regmatches和regexpr的:regmatches colnamesm,regexpr[a-z],tolowercolnamesm