给出相似的样本名称,提取成对矩阵的值

时间:2013-08-30 15:47:10

标签: r matrix

想象一下由几个样本形成的成对距离矩阵,其中一些样本具有重复,即除了末尾的_r之外具有相同名称的样本,而另一些样本则没有。矩阵显然给出了所有样本对之间的距离,重复或不重复。我感兴趣的只是每个样本 - 复制对之间的值。

例如,给定一个带有样本的矩阵,如:

          Sample1  Sample1_r Sample2 Sample2_r Sample3
Sample1      0        79       111     113      110
Sample1_r    79       0        110     112      109
Sample2      111      110      0       80       115
Sample2_r    113      112      80      0        117
Sample3      110      109      115     117      0

理想情况下,我想获得一个数据框:

Sample1 79
Sample2 80

如何以易于重复的方式提取它?我有几个矩阵,它们都是不同的,所以我不能按位置来做。我知道我应该使用grep,但除此之外,我的创造力现在无效。非常感谢。

dput示例

m<-structure(c(0, 79.0003888816214, 111.103209038065, 113.10726184344, 110.411316165512, 79.0003888816214, 0, 110.512687922526, 112.516740727902, 109.820795049973, 111.103209038065, 110.512687922526, 0, 80.1995887790629, 115.32854184629, 113.10726184344, 112.516740727902, 80.1995887790629, 0, 117.332594651665, 110.411316165512, 109.820795049973, 115.32854184629, 117.332594651665, 0), .Dim = c(5L, 5L), .Dimnames = list(c("Sample1", "Sample1_r", "Sample2", "Sample2_r", "Sample3"), c("Sample1", "Sample1_r", "Sample2", "Sample2_r", "Sample3")))

3 个答案:

答案 0 :(得分:2)

example <- matrix(data=c(0,79,111,113,110,79,0,110,112,109,111,110,0,80,115,113,112,80,0,117,110,109,115,117,0),nrow=5,ncol=5,dimnames=list(c("Sample1","Sample1_r","Sample2","Sample2_r","Sample3"),c("Sample1","Sample1_r","Sample2","Sample2_r","Sample3")))

> example
Sample1 Sample1_r Sample2 Sample2_r Sample3
Sample1         0        79     111       113     110
Sample1_r      79         0     110       112     109
Sample2       111       110       0        80     115
Sample2_r     113       112      80         0     117
Sample3       110       109     115       117       0

row.ind <- grep("_r",rownames(example),value=TRUE)
col.ind <- match(sub("_r","",row.ind),colnames(example))
your.df <- data.frame(sample=colnames(example)[col.ind],
                      dist=diag(example[row.ind,col.ind])
                     )

> your.df
   sample dist
1 Sample1   79
2 Sample2   80

答案 1 :(得分:1)

这是一种使用矩阵来提取所需值的方法。

如有必要,将dist对象转换为matrix。您的示例数据已经只是类matrix,因此在这种情况下,as.matrix不是必需的。然后,使用grep查找您感兴趣的rownames,使用strsplit获取相关的colnames。使用生成的矩阵从原始矩阵中进行子集化。

## m <- as.matrix(m) # if your object is actually a `dist` matrix
row_names <- grep("_r", rownames(m), value=TRUE)
toget <- cbind(row_names, col_names = unlist(strsplit(row_names, "_r")))
m[toget]
# [1] 79.00039 80.19959

输出为data.frame

data.frame(toget, value = m[toget])
#   row_names col_names    value
# 1 Sample1_r   Sample1 79.00039
# 2 Sample2_r   Sample2 80.19959

答案 2 :(得分:0)

简短回答:

rn <- rownames(m)
sapply(rn[grepl("_r$",rn)], function(x)m[x,substr(x,1,nchar(x)-2)])

结果

Sample1_r Sample2_r 
 79.00039  80.19959