我有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
我有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
這取決於有點什麼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
假設混合情況低/大寫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你可以使用'tolower'來確保姓名匹配。我正在使用'regmatches'和'regexpr'像這樣:'regmatches(colnames(m),regexpr(「[a-z]」,tolower(colnames(m))))' –
試着這麼做:
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 ".."
看一看分裂和使用SUBSTR你colnames的第一個字母來分割。 – Chargaff