我有一个成对的距离矩阵(4x4)。如何从此矩阵转换为具有2行的列格式?为什么要两排?因为我不希望所有的成对比较,所以只有一半在输出中显示。例如,如果我有一个10x10的矩阵,我将进行100次比较,但是在这100次中只有5个与我有关,而这5个将是物种1与物种2,物种3与物种4,物种5与物种6,物种7与物种8,物种9与物种种类10。
输入:
species1 species2 species3 species4
species1 0 0.093165625 0.228683707 0.194066949
species2 0.093165625 0 0.155611221 0.129896673
species3 0.228683707 0.155611221 0 0.04360685
species4 0.194066949 0.129896673 0.04360685 0
输出:
species1 species2 0.093165625
species3 species4 0.04360685
答案 0 :(得分:2)
不确定为什么您希望转换后的矩阵只有两行,但是通常可以使用stack
mat <- as.matrix(read.table(text =
" species1 species2 species3 species4
species1 0 0.093165625 0.228683707 0.194066949
species2 0.093165625 0 0.155611221 0.129896673
species3 0.228683707 0.155611221 0 0.04360685
species4 0.194066949 0.129896673 0.04360685 0", header = T))
stack(mat)[, c(1, 2, 4)]
#DataFrame with 16 rows and 3 columns
# row col NA
# <character> <Rle> <numeric>
#1 species1 species1 0
#2 species2 species1 0.093165625
#3 species3 species1 0.228683707
#4 species4 species1 0.194066949
#5 species1 species2 0.093165625
#... ... ... ...
#12 species4 species3 0.04360685
#13 species1 species4 0.194066949
#14 species2 species4 0.129896673
#15 species3 species4 0.04360685
#16 species4 species4 0
答案 1 :(得分:0)
这是一个非常独特的请求。您希望所有其他条目都来自一次性对角线。好吧。
我最喜欢的将数据从宽格式转换为长格式的方法是使用melt()
包中的reshape2
。然后构造提取所需值的序列。
> mat <- as.matrix(read.table(text =
+ " species1 species2 species3 species4
+ species1 0 0.093165625 0.228683707 0.194066949
+ species2 0.093165625 0 0.155611221 0.129896673
+ species3 0.228683707 0.155611221 0 0.04360685
+ species4 0.194066949 0.129896673 0.04360685 0", header = T))
> library(reshape2)
> N <- nrow(mat)
> melt(mat)[seq(from=N+1,to=N^2,by=2*(N+1)),]
Var1 Var2 value
5 species1 species2 0.09316563
15 species3 species4 0.04360685