Выбор наименьшего числа в матрице за исключением тех, которые расположены на главной диагональной линии - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь определить сходство слов, содержащихся в столбце А и составить матрицу с помощью функции 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 голосов
/ 01 октября 2018

Отсутствие какой-либо копии 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')) )
0 голосов
/ 01 октября 2018

Если вы хотите, чтобы наименьшее число матрицы (или df) не было на диагонали, вы всегда можете сделать это, убедившись, что значение min не на диагонали.Один из способов сделать это - df2 = df + diag (max (df) + 1, nrow (df), ncol (df)).Тогда min (df2) не будет на диагонали.

0 голосов
/ 01 октября 2018

Рассмотрим mat ваши данные. Рамка:

> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...