Этот вопрос является продолжением how to extract intragroup and intergroup distances from a distance matrix? in R. В этом вопросе они сначала вычислили матрицу расстояний для всех точек, а затем просто извлекли межклассовую матрицу расстояний. У меня есть ситуация, когда я хотел бы обойти начальные вычисления и пропустить право на извлечение, т. Е. Я хочу напрямую вычислить межклассовую матрицу расстояний. Исходя из связанных, например, с ухищрениями, скажем, у меня есть некоторые данные в dataframe называются df
:R Межклассовая матрица расстояний
values<-c(0.002,0.3,0.4,0.005,0.6,0.2,0.001,0.002,0.3,0.01)
class<-c("A","A","A","B","B","B","B","A","B","A")
df<-data.frame(values, class)
То, что я хотел бы это расстояние матрица:
1 2 3 8 10
4 .003 .295 .395 .003 .005
5 .598 .300 .200 .598 .590
6 .198 .100 .200 .198 .190
7 .001 .299 .399 .001 .009
9 .298 .000 .100 .298 .290
ли уже существует в R элегантный и быстрый способ сделать это?
EDIT После получения хорошего решения для 1D выше случае, я думал о бонусной вопрос: что о многомерном случае, скажем, если вместо df
выглядит следующим образом:
values1<-c(0.002,0.3,0.4,0.005,0.6,0.2,0.001,0.002,0.3,0.01)
values2<-c(0.001,0.1,0.1,0.001,0.1,0.1,0.001,0.001,0.1,0.01)
class<-c("A","A","A","B","B","B","B","A","B","A")
df<-data.frame(values1, values2, class)
И я Интересно снова получить матрицу евклидова расстояния между точками в классе B
с очками в классе A
.
Спасибо за ваш невероятно подробный ответ! Это прекрасно работает. – itf
Это работает, но я нахожу проблему: с гораздо большим набором данных по 1000 баллов в каждом классе, я получаю NaN в 'd'. Я проверяю записи 'tmp $ A' и' tmp $ B', используя 'a <- which (is.nan (d), arr.ind = T)', а затем делает, например, 'tmp $ A [a [1],] 'и' tmp $ A [a [nrow (a) + 1],] ', и я обнаружил, что NaN, похоже, возникают, когда векторы обоих классов идентичны. Это точная вещь? Извините, я не могу привести конкретный пример, поскольку мой набор данных слишком велик. – itf
Это может быть. Единственная причина для NaN в вычислении состоит в том, что квадратное расстояние оказывается отрицательным, что может быть связано с точностью. Чтобы проверить, удалите квадратный корень и посмотрите, есть ли в полученной матрице отрицательные числа. Они должны быть небольшими. Если это проблема, то просто порог до нуля, прежде чем принимать квадратный корень. Если это не проблема, сообщите мне. – aichao