【问题标题】:Match multiple columns in two data frames and print unequal匹配两个数据框中的多列并打印不相等
【发布时间】:2016-10-19 14:14:07
【问题描述】:

所以我有两个大的(在某些部分不同的)数据框,第一个名为 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 sifpredmID 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

这也是两个数据帧的 dput:

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

【问题讨论】:

    标签: r


    【解决方案1】:

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

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

    这会告诉您失踪人员的 ID。然后,您可以使用match 或:

    left_join(output, sifrant) %>% select(sifpredm, predmet, ID, NAME)
    

    【讨论】:

    • 是的,我错过了 dput 中的一行。谢谢。但是你的输出给出了IDP PREDMET ID NAME 1 200_1 zakonod _954 Klara,但我的输出应该是不在 sifrant 中的类的 ID,所以它应该是 IDP PREDMET ID NAME 1 120_1 ustanove _954 Klara`
    • 不,结果是一样的,我仍然得到200_1 ...。所以在我的例子中,IDP 120_1 的 Klara 在baza 但不在sifrant,所以我的输出应该看起来像这样:120_1 ustanove _954 Klara,因为这个讲座不在sifrat,而是在baza
    • 再次编辑。希望它应该反映您现在的需求。
    • Malenkost stari! lp
    • 哈哈 :)。传奇:)。
    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 2016-10-23
    • 2018-07-12
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2021-01-15
    相关资源
    最近更新 更多