0

我有两个数据框:代码和供应。代码(如下所示)由四个字段组成:状态、代码类型、代码、代码标题供应有 12 列,但其中三个是状态、代码类型和代码

下面是一个例子

    state     codetype    code    codetitle
      32          15     123456     Something
      32          15     123455     Something Else
      32          10     123455     Something Else

从那里,我使用以下代码连接项目

    supply1<- supply%>%mutate(supply1= paste0(state,codetype,code))
    codes1<- codes%>%mutate(codes1= paste0(state,codetype,code))

我的问题是如何找出供应1中的状态、代码类型、代码的组合,而不是代码1。我会使用 excel 和 match 函数来执行此操作,但是有 190 万行,这超出了 Excel 的容量。

已经查看了有关 antijoin 的文档。但是,由于没有 ID 等通用字段,因此有点困惑。

4

2 回答 2

3

tidyverse

library(dplyr)
anti_join(supply, codes, by = c("state", "codetype", "code"))
#   state codetype   code   codetitle
# 1    34       15 123459 Something_4

碱基R

codes$code_rn <- seq_len(nrow(codes))
supply$supply_rn <- seq_len(nrow(supply))
temp <- merge(codes, supply, by = c("state", "codetype", "code"))
temp
#   state codetype   code    codetitle.x code_rn codetitle.y supply_rn
# 1    32       15 123455 Something_Else       2 Something_3         2
# 2    32       15 123456      Something       1 Something_2         1
supply[ !supply$supply_rn %in% temp$supply_rn, ]
#   state codetype   code   codetitle supply_rn
# 3    34       15 123459 Something_4         3

(和一些列清理)

替代碱基R

这实际上是您开始的内容:

supply_id <- with(supply, paste(state, codetype, code, sep = "|"))
supply_id
# [1] "32 15 123456" "32 15 123455" "34 15 123459"
codes_id <- with(codes, paste(state, codetype, code, sep = "|"))
codes_in
# [1] "32|15|123456" "32|15|123455" "32|10|123455"
supply[!supply_id %in% codes_id,]
#   state codetype   code   codetitle supply_rn
# 3    34       15 123459 Something_4         3

数据

codes <- read.table(header = TRUE, text="
    state     codetype    code    codetitle
      32          15     123456     Something
      32          15     123455     Something_Else
      32          10     123455     Something_Else")
supply <- read.table(header = TRUE, text="
    state     codetype    code    codetitle
      32          15     123456     Something_2
      32          15     123455     Something_3
      34          15     123459     Something_4")
于 2020-10-12T20:43:13.390 回答
2

使用data.table,我们on在将“供应”转换为data.table( setDT) 之后加入列。通过否定 ( !),我们检查“代码”数据集中不匹配的元素

library(data.table)
setDT(supply)[!codes, on = c("state", "codetype", "code")]
于 2020-10-12T22:49:59.930 回答