使用wlidcard子集化成对矩阵

时间:2018-04-24 12:24:01

标签: r subset pairwise

我想将大的成对矩阵的一部分子集化为更小的矩阵。 e.g。

    TF1 TF2 TF3 TG1 TG2 TG3
TF1 0    2   1  450 460 450
TF2 2    0   1  452 462 462
TF3 1    2   0  451 461 451
TG1 450 452 450 0   2   0
TG2 460 462 462 2   0   1
TG3 450 452 451 1   2   0

如果输入确切的列和行名称“TF1”等,我可以进行子集但是我想要例如所有的TF。

我认为这可能是一个问题,但我不能把grep放在我的论坛中的任何地方:

TF <-T_PW[c("TF1","TF2","TF3"),c("TF1","TF2","TF3")]

这是预期的输出矩阵:

    TF2 TF3 TF1   
TF1 0   2   1
TF2 2   0   1
TF3 1   2   0

是因为它是成对的,所以列和行都有名称吗?

谢谢

1 个答案:

答案 0 :(得分:0)

grep返回与提供的正则表达式匹配的输入索引:

> grep('^TF', rownames(T_PW))
[1] 1 2 3

> grep('^TF', colnames(T_PW))
[1] 1 2 3

因此,您可以将grep置于[]内,以对矩阵的rownamescolnames进行分组:

TF = T_PW[grep('^TF', rownames(T_PW)), grep('^TF', colnames(T_PW))]

由于rownamescolnames对称,您也可以执行以下操作:

TF_names = grep('^TF', colnames(T_PW))

T_PW[TF_names, TF_names]

<强>结果:

    TF1 TF2 TF3
TF1   0   2   1
TF2   2   0   1
TF3   1   2   0

数据:

T_PW = read.table(text="    TF1 TF2 TF3 TG1 TG2 TG3
TF1 0    2   1  450 460 450
                 TF2 2    0   1  452 462 462
                 TF3 1    2   0  451 461 451
                 TG1 450 452 450 0   2   0
                 TG2 460 462 462 2   0   1
                 TG3 450 452 451 1   2   0", header = TRUE, row.names=1)

T_PW = as.matrix(T_PW)