选择矩阵中最小的数字(主斜线上的数字除外)

时间:2018-10-01 15:15:50

标签: r

我试图识别列A中包含的单词的相似性,并使用adist函数生成矩阵。我想选择距离最短的单词(对角线上除外)。因此,我应用了一个可识别倒数第二个数字的函数,但有时它会在对角线上包含0,因为根据定义,矩阵主对角线上的所有数字均为0。除了主对角线上的数字,我想获得最小的数字。

a1 = df['A']
a2 = df['A']
dist.name <- adist(a1$A, a2$A, partial = TRUE, ignore.case = TRUE)
min.name <- apply(dist.name, 1, function(x)(sort(x)[2]))

下面是dist.name矩阵的示例。

    a1  a2  a3  a4  a5
a1  0   3   0   3   1
a2  1   0   3   5   0
a3  2   3   0   0   5
a4  3   0   1   0   5
a5  0   3   2   1   0

我希望能够选择[a1,a3]而不是[a1,a1]。

3 个答案:

答案 0 :(得分:1)

请考虑mat是您的data.frame:

> mat2 <- as.matrix(mat)
> diag(mat2) <- NA

替代1

  > apply(mat2, 1, min, na.rm=TRUE) 
    a1 a2 a3 a4 a5 
     0  0  0  0  0

替代2

> which(mat2==min(mat2, na.rm = TRUE), arr.ind = TRUE)
   row col
a5   5   1
a4   4   2
a1   1   3
a3   3   4
a2   2   5

答案 1 :(得分:1)

缺少df的任何副本,甚至没有清晰的描述,这都是猜测。代码:

 !diag(dim(dist.name)[1] )

...创建一个与dist.name相同尺寸的逻辑方阵,并在用作索引时选择非对角元素,因此:

 min.name <- min( dist.name[!diag(dim(dist.name)[1] )]

重建dist.name矩阵的副本后,我们看到它仍然找到非对角元素中的所有0。所以我也许不明白目标,但是对diag(5)的求反会删除所有对角线零:

dist.name <- matrix( scan(text="
   0   3   0   3   1
   1   0   3   5   0
   2   3   0   0   5
   3   0   1   0   5
   0   3   2   1   0"), 5,5,byrow=TRUE, dimnames=list(c(    'a1',  'a2',  'a3',  'a4',  'a5'), c(    'a1',  'a2',  'a3',  'a4',  'a5')) )

答案 2 :(得分:1)

如果您希望矩阵(或df)上的最小数目不在对角线上,则始终可以通过确保最小值不在对角线上来实现。一种方法是- df2 = df + diag(max(df)+ 1,nrow(df),ncol(df))。那么min(df2)将不在对角线上。