Используя внешний()
Вам не нужно работать с фреймом данных. В вашем примере, мы можем собрать ваши даты в одном векторе и использовать outer()
x <- c(time1, time2, time3)
abs(outer(x, x, "-"))
[,1] [,2] [,3]
[1,] 0 1 2
[2,] 1 0 1
[3,] 2 1 0
Примечание Я добавил abs()
снаружи, так что вы только получите положительную разницу во времени, то есть, разница во времени «сегодня - вчера »и« вчера - сегодня »равны 1.
Если ваши данные предварительно сохранены в кадре данных, вы можете извлечь этот столбец в качестве вектора, а затем продолжить.
Использование dist()
Как упоминалось Конрада, dist()
часто используется для вычисления матрицы расстояний. Наибольшее преимущество заключается в том, что он будет вычислять только нижнюю/верхнюю треугольную матрицу (диагональ равна 0) при копировании остальных. С другой стороны, outer()
заставляет вычислять все матричные элементы, не зная симметрии.
Однако dist()
принимает численные векторы и вычисляет только некоторые классы расстояний. См. ?dist
Arguments:
x: a numeric matrix, data frame or ‘"dist"’ object.
method: the distance measure to be used. This must be one of
‘"euclidean"’, ‘"maximum"’, ‘"manhattan"’, ‘"canberra"’,
‘"binary"’ or ‘"minkowski"’. Any unambiguous substring can
be given.
Но мы можем работать, чтобы использовать его.
Объект Date, может быть принудительно введен в целые числа, если вы дадите ему источник. К
x <- as.numeric(x - min(x))
мы получаем количество дней с первого дня записи. Теперь мы можем использовать dist()
с расстоянием по умолчанию Euclidean
:
y <- as.matrix(dist(x, diag = TRUE, upper = TRUE))
rownames(y) <- colnames(y) <- c("A", "B", "C")
A B C
A 0 1 2
B 1 0 1
C 2 1 0
Почему положить outer()
как мой первый пример
В принципе, разница во времени не подписан. В этом случае
outer(x, x, "-")
более подходит. Я добавил abs()
позже, потому что кажется, что вы намеренно хотите положительный результат.
Кроме того, outer()
имеет гораздо более широкое применение, чем dist()
. Посмотрите на my answer here. Этот ОП просит вычислить расстояние Хэмминга, что на самом деле является своего рода побитовым расстоянием.
@ZheyuanLi Написать ответ, то вы можете также правильно форматировать код. –
В общем случае решением такого рода проблемы в R является функция 'dist'. В вашем случае 'dist (test $ Date)' "работает более или менее; однако 'dist' не знает о времени, поэтому результатом являются только числа, а не объекты timediff, что может быть проблемой. По этой причине вышеизложенное замечание Чжэюана показывает лучший ответ. –