2013-07-24 192 views
1

我有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 
+0

看一看分裂和使用SUBSTR你colnames的第一个字母来分割。 – Chargaff

回答

1

这取决于有点什么e xactly你想要做的。下面是几个例子:

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[,1:2] 
mat[,3:4] 
mat[,5:6] 

如果你想这样做取决于列名的第一个字母,您可以手动选择你想要的列名:

mat[,substr(colnames(mat), 1, 1)=="A"] 

,或者你可以得到所有可能的COLUMNNAMES列表

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 
5

假设混合情况低/大写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 
+1

+1你可以使用'tolower'来确保姓名匹配。我正在使用'regmatches'和'regexpr'像这样:'regmatches(colnames(m),regexpr(“[a-z]”,tolower(colnames(m))))' –

1

试着这么做:

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