0

想象一个由几个样本组成的成对距离矩阵,其中一些具有重复,即具有相同名称的样本,除了末尾的_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,但除此之外,我的创造力现在是空的。非常感谢帮助。

输入示例

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")))
4

3 回答 3

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
于 2013-08-30T16:03:07.680 回答
1

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

如有必要,将您的dist对象转换为 a 。matrix您的示例数据已经只是 class 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
于 2013-08-30T16:08:42.393 回答
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 
于 2013-08-30T16:26:14.913 回答