最后一个数据:
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
如何获得它?
您实际尝试做的是
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
中不存在的行。<<<<<<<<<<<<<<<<<<<<
您可以使用基本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