将组合输出转换为 'dist' 类型的矩阵
Convert combn output to matrix of type 'dist'
我有以下形式的数据框:
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
但我希望它以类似矩阵的形式显示(这实际上与 class '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 循环,但我觉得应该有更直接的方法。
有什么建议吗?非常感谢!
下面是一个相对简单的将向量转换为距离矩阵的方法:
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
这是使用 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
对象。
您也可以使用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
我有以下形式的数据框:
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
但我希望它以类似矩阵的形式显示(这实际上与 class '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 循环,但我觉得应该有更直接的方法。
有什么建议吗?非常感谢!
下面是一个相对简单的将向量转换为距离矩阵的方法:
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
这是使用 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
对象。
您也可以使用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