匹配两个数据框中的多个列并打印不相等

时间:2016-10-19 14:14:08

标签: r

所以我有两个大的(部分不同的)数据框,首先命名为 sifrant ,包括:

   IDP   PREDMET   ID    NAME
1 120_1  ustanove  _18 Barbara
2 120_1  ustanove _301  Mojca 
3 200_1  zakonod  _954  Klara

其他数据框架已停止 baza

predmet sifpredm izvajalec1 sifizv1 izvajalec2 sifizv2 izvajalec3 sifizv3 izvajalec4 sifizv4 izvajalec5 sifizv5
ustanove    120_1   Barbara      _18     Mojca     _301     Klara     _954         -2      -2         -2      -2
ustanove    120_1   Barbara      _18     Mojca     _301         -2      -2         -2      -2         -2      -2

Boath数据框在下一列中应具有相同的值:IDP==sifpredmID==sifizv1, siizv2, sifizv3, and so on

现在我想匹配这些专栏  IDP with sifpredm和  ID with sifizv1 and sifizv2 and sifizv3等等。

基于匹配,我想打印 sifrant 中没有匹配的IDP, ID and NAME(即,在sifrant中缺少并且在baza中存在)

比较两个数据框我可以看到在数据框sifrant讲师Klara缺少IDP 120_1。所以我的输出应该打印哪个sifpredm,sifizv和izvajalec在baza但不在sifrant。在我的情况下, sifrant 缺少ID号为120_1的课程,讲师ID号为_954,讲师名称为Klara

到目前为止,我已经尝试了

    merge(sifrant, baza, by.x = "IDP",by.y="sifpredm" , all = T)

 require(sqldf)
    sifrantNotInbaza <- sqldf('SELECT * FROM baza EXCEPT SELECT * FROM sifrant')

library(diffobj)
install.packages("diffobj")
diffPrint(sifrant, baza)
diffObj(sifrant, baza)

我也看过这里

Compare two data.frames to find the rows in data.frame 1 that are not present in data.frame 2

这也是两个数据帧的输入:

structure(list(IDP = c("120_1", "120_1"), PREDMET = c("ustanove", 
" ustanove"), ID = c("_18", "_301"), NAME = c("Barbara", "Mojca "
)), .Names = c("IDP", "PREDMET", "ID", "NAME"), class = "data.frame", row.names = c(NA, 
-2L))


structure(list(predmet = c("ustanove", "ustanove"), sifpredm = c("120_1", 
"120_1"), izvajalec1 = c("Barbara ", "Barbara "), sifizv1 = c("_18", 
"_18"), izvajalec2 = c("Mojca ", "Mojca "), sifizv2 = c("_301", 
"_301"), izvajalec3 = c("Klara ", "-2"), sifizv3 = c("_954", 
"-2"), izvajalec4 = c(-2L, -2L), sifizv4 = c(-2L, -2L), izvajalec5 = c(-2L, 
-2L), sifizv5 = c(-2L, -2L)), .Names = c("predmet", "sifpredm", 
"izvajalec1", "sifizv1", "izvajalec2", "sifizv2", "izvajalec3", 
"sifizv3", "izvajalec4", "sifizv4", "izvajalec5", "sifizv5"), class = "data.frame", row.names = c(NA, 
-2L))

1 个答案:

答案 0 :(得分:1)

我认为您需要纠正您的sifrant的输入。我复制了你在描述中的表格。 然后我会做类似的事情:

library(tidyverse)
baza2 <- baza %>% 
           gather(contains("sifizv"), 
                key = "sifizv", 
                value = "ID"
                ) %>% 
           select(1:2,ID) %>% 
           unique()
output <- anti_join(baza2, sifrant, by = c("sifpredm" = "IDP", "ID"))

这会告诉您失踪者的身份证明。然后,您可以使用match或:

查找其名称
left_join(output, sifrant) %>% select(sifpredm, predmet, ID, NAME)