R: Как получить отсутствующие записи на основе значений в двух столбцах - PullRequest
0 голосов
/ 19 мая 2018

У меня есть два больших кадра данных координат долготы / широты, CoastalStates_Tax и CoastalStates, которые в основном совпадают, за исключением того, что CoastalStates_Tax имеет еще несколько миллионов координат.Я хочу выяснить, какие строки в CoastalStates_Tax не находятся в CoastalStates, но все еще должны иметь возможность отслеживать индексы отсутствующих строк, где бы они ни находились в наборе данных Tax.

Вот как выглядит CoastalStates_Tax:

  RecordID_b PROPERTY LEVEL LONGITUDE PROPERTY LEVEL LATITUDE
1  132381977                -77.06421                39.16937
2  132381978                -77.18106                39.08811
3  132381979                -77.03353                39.02414
4  132381980                -77.09930                39.00716
5  132381981                -77.25450                39.10422
6  132381982                -77.02797                39.08087

И CoastalStates:

  RecordID PROPERTY LEVEL LONGITUDE PROPERTY LEVEL LATITUDE
1        1                -80.24787                25.85063
2        2                -80.14940                25.84582
3        3                -80.13115                25.85699
4        4                -80.37275                25.77741
5        5                -80.12095                25.82633
6        6                -80.39949                25.73273

Я пытался использовать функцию dplyr anti_join с anti_join(CoastalStates_Tax,CoastalStates,by=c("PROPERTY LEVEL LONGITUDE","PROPERTY LEVEL LATITUDE")), но это дает мне только 4 635 393 строки.
Разница в строках между двумя наборами данных составляет 4 637 029, поэтому я пропускаю около 1600 строк, но не могу понять, почему.Неправильно ли я использую anti_join, и если да, то есть ли какие-либо предложения относительно других способов решения этой проблемы?

1 Ответ

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

Мое предложение будет round по долготе и широте с точностью до 3 знаков после запятой (с точностью до 110 метров), а затем преобразовать в character перед присоединением к этим столбцам.

Попытка может быть как:

library(dplyr)

CoastalStates_Tax %>% 
mutate_at(vars(starts_with("PROPERTY.LEVEL")), funs(as.character(round(.,3)))) %>%
anti_join(mutate_at(CoastalStates, 
         vars(starts_with("PROPERTY.LEVEL")), funs(as.character(round(.,3)))),
            by=c("PROPERTY.LEVEL.LONGITUDE", "PROPERTY.LEVEL.LATITUDE"))

#   RecordID_b PROPERTY.LEVEL.LONGITUDE PROPERTY.LEVEL.LATITUDE
# 1  132381977                  -77.064                  39.169
# 2  132381978                  -77.181                  39.088
# 3  132381979                  -77.034                  39.024
# 4  132381980                  -77.099                  39.007
# 5  132381981                  -77.254                  39.104
# 6  132381982                  -77.028                  39.081
...