R

时间:2018-12-19 12:12:43

标签: r dplyr

最后数据:

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))

我必须按组将新数据与last进行比较,并且只保留这些last中不存在的行。

我这样做:

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 :(得分:2)

您可以使用基数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

答案 1 :(得分:2)

您实际上想做的是

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中不存在的行。