【问题标题】:R Compare two tables and identify missing value in second tableR比较两个表并识别第二个表中的缺失值
【发布时间】:2023-03-17 16:25:01
【问题描述】:

我有 3 个表,想逐个比较,然后找出缺少的元素。

我的桌子是:

> BaseIda
  Id Quant
1  1     a
2  2     b
3  3     c
4  4     d
5  5     e
6  6     f
7  7     g
> IdaEmpA
  RespA QuantA
1     1     11
2     2     13
3     3     15
4     4      3
5     5     18
6     6      1
7     7      1
> IdaEmpB
  RespB QuantB
1     1     18
2     2     14
3     3     21
4     4      2
5     6     13
6     7      3

我需要将 BaseIda$Id 与 IdaEmpA$RespA 和 IdaEmpB$RespB 进行比较,然后指出缺少哪个值,因为 BaseIda$Id 始终具有所有值。 我发现下面的帖子很有用,但无法让它给出我的答案:Compare two data.frames to find the rows in data.frame 1 that are not present in data.frame 2

我试过了:

comparacaoA <- compare(BaseIda$Id,IdaEmpA$RespA)
comparacaoB <- compare(BaseIda$Id,IdaEmpA$RespB)

我没有使用 allowAll=TRUE,因为我认为阅读帮助文件没有必要。

我得到了这个结果:

> comparacaoA
TRUE
> comparacaoB
FALSE

这是正确的,因为 IdaEmpA$RespA 包含所有数据,而 IdaEmpB$RespB 缺少值 5。

但是当我尝试查看哪些值是正确的时,我得到了这个:

> comparacaoA$tM
[1] 1 2 3 4 5 6 7
> comparacaoB$tM
[1] 1 2 3 4 5 6 7

我认为可能是因为我没有使用 allowAll=TRUE,所以我再次尝试,使用它,得到了这个:

comparacaoA <- compare(BaseIda$Id,IdaEmpA$RespA,allowAll=TRUE)
comparacaoB <- compare(BaseIda$Id,IdaEmpA$RespB,allowAll=TRUE)
> comparacaoA
TRUE
> comparacaoB
FALSE
  coerced from <NULL> to <integer>
  shortened model
  sorted
> comparacaoA$tM
[1] 1 2 3 4 5 6 7
> comparacaoB$tM
[1] 1

预期回报应该是:

> comparacaoA$tM
[1] 1 2 3 4 5 6 7
> comparacaoB$tM
[1] 1 2 3 4 6 7

有人可以帮助我了解我缺少什么吗?我做错了什么?

【问题讨论】:

  • 您的代码中有错误,这就是您没有得到正确答案的原因。看我的回答。
  • 是的,我看到了,非常感谢。

标签: r


【解决方案1】:

关于使用compare 库的代码,您的代码中只是有一个错误。请参阅以下内容:

comparacaoB <- compare(BaseIda$Id,IdaEmpA$RespB,allowAll=TRUE)

您需要将IdaEmpA$RespB 更改为IdaEmpB$RespB,它会正常工作。

compare(BaseIda$Id, IdaEmpB$RespB, allowAll=TRUE)$tM

但是,有很多base 解决方案。 假设您显示的顺序是按降序设置的并且BaseIda 是完全连续的,您可以简单地使用which

BaseIda <- data.frame(Id=seq(7), Quant=letters[seq(7)])
IdaEmpA <- data.frame(RespA=seq(7), QuantA=c(11,13,15,3,18,1,1))
IdaEmpB <- data.frame(RespB=c(1:4, 6:7), QauntB=c(18,14,21,2,13,3))

which(BaseIda$Id %in% IdaEmpA$RespA)
[1] 1 2 3 4 5 6 7
which(BaseIda$Id %in% IdaEmpB$RespB)
[1] 1 2 3 4 6 7

否则,更通用的解决方案是索引“源”向量。

BaseIda$Id[BaseIda$Id %in% IdaEmpA$RespA]
BaseIda$Id[BaseIda$Id %in% IdaEmpB$RespB]

如果您正在寻找元素相同的函数,您也可以使用intersect

intersect(BaseIda$Id, IdaEmpA$RespA)
intersect(BaseIda$Id, IdaEmpB$RespB)

【讨论】:

    【解决方案2】:

    如果您只想找到 BaseIda$IdIdaEmpA$RespAIdaEmpB$RespB 之间不同的值,您可以在向量上使用 setdiff 函数

    【讨论】:

    • setdiff 将返回哪些元素不同,哪些元素不同(这是 OP 所要求的),您可能正在寻找的功能是 intersect
    • 我认为他还需要根据他在第一个代码下编写的内容有所不同:我需要将 BaseIda$Id 与 IdaEmpA$RespA 和 IdaEmpB$RespB 进行比较,然后,点缺少哪个值,考虑到 BaseIda$Id 始终具有所有值。 只是不确定他的最终目标是否不同
    • 完美,使用这两个答案我做了所有我需要的。两者都对我帮助很大。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2019-09-12
    • 1970-01-01
    • 2021-12-23
    • 2011-12-21
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多