Удалить дубликаты на основе комбинированных наборов - PullRequest
0 голосов
/ 16 мая 2018

У меня есть фрейм данных, который выглядит следующим образом:

C <- data.frame(A_Latitude  = c(48.4459, 48.7     , 49.0275, 49.0275,   49.0275, 49.0275,   48.4459),
            A_Longitude = c(9.989    , 8.15   , 8.7539 , 8.7539 ,   8.7539 , 8.7539 , 9.989  ),
            B_Latitude  = c(49.0275, 48.4734,   48.4459, 48.9602,   48.9602, 48.4459,   49.0275),
            B_Longitude = c(8.7539 , 9.227  ,   9.989    , 9.2058 , 9.2058 , 9.989  , 8.7539 ))

Фрейм данных состоит из координат широты / долготы для набора из двух местоположений (A + B; т.е. A_Latitude / A_Longitude, B_Latitude / B_Longitude).

Я хотел бы удалить дубликаты на основе комбинированных наборов (т. Е. Удалить записи строк, где местоположение A / местоположение B эквивалентно местоположению B / местоположению A; то есть строки с A_Latitude / A_Longitude / B_Latitude / B_Longitude = B_Latitude / B_Longitude / A_Latitude / A_Longitude.

Ответы [Поиск уникальных комбинаций независимо от позиции [дубликаты]] и [Удаление дубликатов комбинаций (независимо от порядка)] не помогают, поскольку эти решения не учитывают комбинированные наборы столбцов (которые актуальны здесь при рассмотрении местоположений по всему земному шару (например, координаты широты / долготы эквивалентны для одного местоположения)).

Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 16 мая 2018

Одна идея состоит в том, чтобы рассматривать каждую пару long / lat как строку toString(...) - сортировать две пары long / lat (теперь строки) в строке - затем сортировать результирующий вектор строки из 2 элементов. Используйте отсортированный вектор строк, чтобы проверить наличие дубликатов

ans <- C[!duplicated(lapply(1:nrow(C), function(i) sort(c(toString(C[i,1:2]), toString(C[i,3:4]))))), ]
  # A_Latitude A_Longitude B_Latitude B_Longitude
# 1    48.4459      9.9890    49.0275      8.7539
# 2    48.7000      8.1500    48.4734      9.2270
# 4    49.0275      8.7539    48.9602      9.2058

Вот разбивка по строке 1

toString(C[1,1:2])
# [1] "48.4459, 9.989"
toString(C[1,3:4])
# [1] "49.0275, 8.7539"
sort(c(toString(C[1,1:2]), toString(C[1,3:4])))
# [1] "48.4459, 9.989"  "49.0275, 8.7539"
...