Некорректное сравнение новых данных со старыми в R - PullRequest
0 голосов
/ 19 декабря 2018

Последние данные:

last=structure(list(ItemRelation = 11111L, CalendarYear = 2018L, DocumentNum = 111L, 
    ship_count = 1L), .Names = c("ItemRelation", "CalendarYear", 
"DocumentNum", "ship_count"), class = "data.frame", row.names = c(NA, 
-1L))

Итак, есть новые данные, где могут быть строки, которые есть в последних данных:

new5=structure(list(ItemRelation = c(11111L, 22222L), CalendarYear = c(2018L, 
2017L), DocumentNum = c(111L, 100L), ship_count = c(1L, 23L)), .Names = c("ItemRelation", 
"CalendarYear", "DocumentNum", "ship_count"), class = "data.frame", row.names = c(NA, 
-2L))

Я должен сравнить новые данные с последними по группеи оставил только эти строки, которые отсутствовали в последнем.

Так что я делаю:

mydat=new5[!(new5$DocumentNum%in% last$DocumentNum), !(new5$CalendarYear%in% last$CalendarYear),
           !(new5$ItemRelation%in% last$ItemRelation)]

и результат:

  CalendarYear ship_count
2         2017         2

это неверный вывод.
Правильный вывод

ItemRelation CalendarYear DocumentNum ship_count
      22222         2017         100         23

Как его получить?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

То, что вы на самом деле пытались сделать, было

new5[!(new5$DocumentNum %in% last$DocumentNum & 
       new5$CalendarYear %in% last$CalendarYear &
       new5$ItemRelation %in% last$ItemRelation), ]


# ItemRelation CalendarYear DocumentNum ship_count
#2       22222         2017         100         23

Условие внутри скобки дает нам логический вектор, который сообщает, какая из строк в new5 присутствует в last, добавляязнак отрицания (!), о котором мы говорим, чтобы дать нам строки, которых нет в last.

0 голосов
/ 19 декабря 2018

Вы можете управлять им с помощью базы R и создать уникальное поле в качестве ключа:

# key for last
last$collapsed <- paste0(last$ItemRelation, last$CalendarYear, last$DocumentNum, last$ship_count)  

# key for new5  
new5$collapsed <- paste0(new5$ItemRelation, new5$CalendarYear, new5$DocumentNum, new5$ship_count)

# filter on the key, rather than many field, and dropping the key with ,-5
new5[!new5$collapsed %in% last$collapsed,-5]

  ItemRelation CalendarYear DocumentNum ship_count
2        22222         2017         100         23
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...