想象一下由几个样本形成的成对距离矩阵,其中一些样本具有重复,即除了末尾的_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")))
答案 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