我试图识别列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]。
答案 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)将不在对角线上。