R比较两个表并在第二个表中标识缺失值

时间:2015-01-27 13:40:30

标签: r

我有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

有人能帮我理解我错过了什么吗?我做错了什么?

2 个答案:

答案 0 :(得分:2)

关于使用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

否则,更通用的解决方案是索引“来源”&#39;矢量。

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)

答案 1 :(得分:1)

如果您只想找到 BaseIda $ Id IdaEmpA $ RespA IdaEmpB $ RespB 之间不同的值,那么您可以在向量

上使用 setdiff 函数