В моем наборе данных у меня есть декартовы координаты различных элементов сверхурочных, идентифицированных с помощью EventID, event_type, идентификационного номера, позиции x, y позиции, типа идентификации, широкой категории и номера идентификатора кадра. Что мне нужно сделать, так это пройти по каждому идентификатору EventID, паре event_type и номеру кадра, пройти через каждый номер идентификатора и вычислить, какой другой номер идентификатора с другой широкой категорией имеет минимальное расстояние от текущей строки. Я бы не хотел использовать для этого циклы for, потому что набор данных имеет длину несколько миллионов строк.
Я попытался сформулировать это как group_by и суммировать вызов с помощью dplyr, но не мог полностью понять, как я могу вызвать функцию в текущей строке x, y против всех других x и ys, а затем выбрать условное выражение минимум.
two_dim_euclid = function(x1, x2, y1, y2){
a <- sqrt((x1 - x2)^2 + (y1 - y2)^2)
return(a)
}
# Example Data
df <- data.frame(stringsAsFactors = FALSE,
EventID = c(1003, 1003, 1003, 1003),
event_type = c(893, 893, 893, 893),
ID_number = c(80427, 2346, 24954, 27765),
x = c(86.07, 72.4, 43.08, 80.13),
y = c(35.58, 26.43, 34.8, 34.79),
identity_type = c("A", "C", "B", "B"),
broad_category = c("set1", "set1", "set2", "set2"),
frame_id = c(1, 1, 1, 1))
df
# EventID event_type ID_number x y identity_type broad_category frame_id
#1 1003 893 80427 86.07 35.58 A set1 1
#2 1003 893 2346 72.40 26.43 C set1 1
#3 1003 893 24954 43.08 34.80 B set2 1
#4 1003 893 27765 80.13 34.79 B set2 1
Ожидаемый результат вернет 5.992303 для строки 1, он ищет все записи, не принадлежащие set1 с одинаковыми EventID, event_type и frame_id, а затем возвращает минимальное евклидово расстояние с учетом этих параметров.
Кроме того, я хочу сделать это для каждой записи с типом идентификации A. Но, identity_type и broad_category не всегда связаны друг с другом. A может принадлежать либо set1, либо set2.