如果行名和列名部分匹配,则提取矩阵的行和列
Extracting rows and columns of a matrix if row names and column names have a partial match
我将使用较小的矩阵举例说明我的问题。假设我有一个包含行名和列名的矩阵,如下所示:
set.seed(10)
a <- matrix(rexp(200), ncol=9,nrow = 3)
colnames(a) <- paste(rep(c("aaa" , "bbb" , "ccc") , each = 3) , rep(c(1:3) , times = 3) , sep = "")
rownames(a) <- c("aaa" , "bbb" , "ccc")
给出矩阵a
:
aaa1 aaa2 aaa3 bbb1 bbb2 bbb3 ccc1 ccc2 ccc3
aaa 0.01495641 1.5750419 2.3276229 0.6722683 1.3165471 1.63298388 1.7447187 0.3469224 1.3981074
bbb 0.92022120 0.2316586 0.7291238 0.4265298 0.4132938 0.07119408 0.2929501 0.7950826 1.1104594
ccc 0.75215894 1.0866730 1.2883101 1.1154219 0.6765753 2.56885161 0.6453052 1.3962992 0.1704216
我想找到一个有效的代码,将行名称与每个列名称匹配而不带数字,返回一个向量。在这种情况下:
aaa1 aaa2 aaa3 bbb1 bbb2 bbb3 ccc1 ccc2 ccc3
0.01495641 1.57504185 2.32762287 0.42652979 0.41329383 0.07119408 0.64530516 1.39629918 0.17042160
我使用这段代码获得了之前的矩阵:
b <- c(a[grepl("aaa" , rownames(a)) , grepl("aaa" , colnames(a))] ,
a[grepl("bbb" , rownames(a)) , grepl("bbb" , colnames(a))] ,
a[grepl("ccc" , rownames(a)) , grepl("ccc" , colnames(a))] )
有没有办法有效地做到这一点,即使矩阵大得多并且可能具有与此不同的名称结构?
一个更简单的选择是通过从 table
转换为 data.frame
来重塑为 'long',然后根据 'Var1' 的值 subset
行] 和 'Var2'
out <- subset(as.data.frame.table(a), Var1 == sub("\d+", "", Var2),
select =c(Var2, Freq))
with(out, setNames(Freq, Var2))
aaa1 aaa2 aaa3 bbb1 bbb2 bbb3 ccc1 ccc2 ccc3
0.01495641 1.57504185 2.32762287 0.42652979 0.41329383 0.07119408 0.64530516 1.39629918 0.17042160
或使用 row/column
索引
i1 <- match( sub("\d+", "", colnames(a)), rownames(a))
a[cbind(i1, seq_along(i1))]
[1] 0.01495641 1.57504185 2.32762287 0.42652979 0.41329383 0.07119408 0.64530516 1.39629918 0.17042160
我将使用较小的矩阵举例说明我的问题。假设我有一个包含行名和列名的矩阵,如下所示:
set.seed(10)
a <- matrix(rexp(200), ncol=9,nrow = 3)
colnames(a) <- paste(rep(c("aaa" , "bbb" , "ccc") , each = 3) , rep(c(1:3) , times = 3) , sep = "")
rownames(a) <- c("aaa" , "bbb" , "ccc")
给出矩阵a
:
aaa1 aaa2 aaa3 bbb1 bbb2 bbb3 ccc1 ccc2 ccc3
aaa 0.01495641 1.5750419 2.3276229 0.6722683 1.3165471 1.63298388 1.7447187 0.3469224 1.3981074
bbb 0.92022120 0.2316586 0.7291238 0.4265298 0.4132938 0.07119408 0.2929501 0.7950826 1.1104594
ccc 0.75215894 1.0866730 1.2883101 1.1154219 0.6765753 2.56885161 0.6453052 1.3962992 0.1704216
我想找到一个有效的代码,将行名称与每个列名称匹配而不带数字,返回一个向量。在这种情况下:
aaa1 aaa2 aaa3 bbb1 bbb2 bbb3 ccc1 ccc2 ccc3
0.01495641 1.57504185 2.32762287 0.42652979 0.41329383 0.07119408 0.64530516 1.39629918 0.17042160
我使用这段代码获得了之前的矩阵:
b <- c(a[grepl("aaa" , rownames(a)) , grepl("aaa" , colnames(a))] ,
a[grepl("bbb" , rownames(a)) , grepl("bbb" , colnames(a))] ,
a[grepl("ccc" , rownames(a)) , grepl("ccc" , colnames(a))] )
有没有办法有效地做到这一点,即使矩阵大得多并且可能具有与此不同的名称结构?
一个更简单的选择是通过从 table
转换为 data.frame
来重塑为 'long',然后根据 'Var1' 的值 subset
行] 和 'Var2'
out <- subset(as.data.frame.table(a), Var1 == sub("\d+", "", Var2),
select =c(Var2, Freq))
with(out, setNames(Freq, Var2))
aaa1 aaa2 aaa3 bbb1 bbb2 bbb3 ccc1 ccc2 ccc3
0.01495641 1.57504185 2.32762287 0.42652979 0.41329383 0.07119408 0.64530516 1.39629918 0.17042160
或使用 row/column
索引
i1 <- match( sub("\d+", "", colnames(a)), rownames(a))
a[cbind(i1, seq_along(i1))]
[1] 0.01495641 1.57504185 2.32762287 0.42652979 0.41329383 0.07119408 0.64530516 1.39629918 0.17042160