我有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
有人能帮我理解我错过了什么吗?我做错了什么?
答案 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 函数