【问题标题】:how to find what is in data frame and not another in R如何查找数据框中的内容而不是 R 中的其他内容
【发布时间】:2021-01-27 02:21:55
【问题描述】:

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

下面是一个例子

    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等通用字段,所以有点混乱。

【问题讨论】:

  • 听起来您正在寻找“反连接”。 dplyr 包中有一个名为 anti_join 的函数。或者,您可以在刚刚创建的向量上使用setdiff(supply1$supply1, codes1$codes1)
  • @Vincent 最初是正确的 (anti_join),但如果您仅根据一列进行判断,setdiff 将起作用。试试anti_join(supply1, codes1, by = c("state", "codetype", "code"))。在 base R 中使用 merge 是可行的,尽管它需要一个额外的步骤(和一个临时列)。

标签: r concatenation match anti-join


【解决方案1】:

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

library(data.table)
setDT(supply)[!codes, on = c("state", "codetype", "code")]

【讨论】:

  • 这行得通。但是,是否有关于我如何理解/解释结果的信息?
  • @TimWilcox 谢谢,我更新了一些描述。
【解决方案2】:

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

【讨论】:

  • 我的例子很小。实际上,我的供应表有 234,966 行。虽然代码运行没有错误,但它表明我已达到最大值,结果集中基本上有 234,944 行。
  • 我明白了。那么最好使用paste0(..., sep="|") 选项(一些分隔字符串)并使用!a %in% b`。 2 分钟后查看我的编辑
猜你喜欢
  • 1970-01-01
  • 2022-07-01
  • 2018-09-02
  • 2014-06-03
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
相关资源
最近更新 更多