将combn输出转换为'dist'类型的矩阵

4

我可以帮助您进行翻译。以下是一个数据框的例子:

   dim1  dim2
1 Loc.1 0.325
2 Loc.2 0.325
3 Loc.3 0.321
4 Loc.4 0.256
5 Loc.5 0.255

我希望能计算'dim2'内每两个(2)元素的平均值,并将输出转换为矩阵;同时保留'dim1'提供的信息。
目前,我可以使用combn函数得到成对均值:
combn(tab[,2],2, mean)
[1] 0.3250 0.3230 0.2905 0.2900 0.3230 0.2905 0.2900 0.2885 0.2880 0.2555

但我希望它以类似矩阵的形式显示(实际上与“dist”类的对象非常相似,因为我希望将其用于进一步的分析),就像这样:

        Loc.1   Loc.2   Loc.3   Loc.4
Loc.2   0.325           
Loc.3   0.323   0.323       
Loc.4   0.290   0.291   0.289   
Loc.5   0.290   0.290   0.288   0.256

(你可能也看到了)我还需要信息“ Loc.x ”。

我找不到一个简单的函数,可以直接在我的数据框'tab'上进行成对计算。我可以使用for循环,但我觉得应该有更直接的方法。

有什么建议吗?非常感谢!

3个回答

4
以下是将向量转换为距离矩阵的相对简单方法:
vec <- c(0.3250, 0.3230, 0.2905, 0.2900, 0.3230, 0.2905, 0.2900, 0.2885, 0.2880, 0.2555)

mat <- matrix(nrow = 5, ncol = 5)
mat[lower.tri(mat)] <- vec
mat <- as.dist(mat)

#output
> mat
       1      2      3      4
2 0.3250                     
3 0.3230 0.3230              
4 0.2905 0.2905 0.2885       
5 0.2900 0.2900 0.2880 0.2555

4

这是一个使用 expand.grid 而不是 combn 的单行代码。

as.dist(matrix(apply(expand.grid(tab[, 2], tab[, 2]), 1, mean), 5, 5))
#       1      2      3      4
#2 0.3250
#3 0.3230 0.3230
#4 0.2905 0.2905 0.2885
#5 0.2900 0.2900 0.2880 0.2555

这个方法能够奏效的原因是因为 expand.grid 考虑了两个列向量 tab[, 2] 的所有可能组合,而 combn 则错过了对角元素;我们在组合矩阵上逐行操作,计算平均值,并将 vector 首先转换为 matrix,然后再转换为 dist 对象。

2
您还可以使用outer函数。
dim2 <- as.numeric(tab$dim2)
names(dim2) <- tab$dim1
x <- outer(dim2, dim2, function(x,y) (x + y) / 2)
as.dist(x)
#        Loc.1  Loc.2  Loc.3  Loc.4
# Loc.2 0.3250                     
# Loc.3 0.3230 0.3230              
# Loc.4 0.2905 0.2905 0.2885       
# Loc.5 0.2900 0.2900 0.2880 0.2555

非常感谢大家!所有这些答案都非常有用。祝一切顺利! - Chrys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接