如何在 Julia DataFrames 中进行紧密连接?

War*_*ang 7 r julia dataframes.jl

classA = Dataset(id = ["id1", "id2", "id3", "id4", "id5"],
                        mark = [50, 69.5, 45.5, 88.0, 98.5]);

grades = Dataset(mark = [0, 49.5, 59.5, 69.5, 79.5, 89.5, 95.5],
                        grade = ["F", "P", "C", "B", "A-", "A", "A+"]);
Run Code Online (Sandbox Code Playgroud)

我们可以使用 InMemorydatasets 包来进行 closejoin。

我们如何在 DataFrames 包中执行此方法。

closejoin(classA, grades, on = :mark)
Run Code Online (Sandbox Code Playgroud)
closejoin(classA, grades, on = :mark, direction=:forward, border=:nearest)
Run Code Online (Sandbox Code Playgroud)

以及如何在 R 中做到这一点?

GKi*_*GKi 6

R中,可以通过使用findInterval.

\n
classA = data.frame(id = c("id1", "id2", "id3", "id4", "id5"),\n                        mark = c(50, 69.5, 45.5, 88.0, 98.5))\n\ngrades = data.frame(mark = c(0, 49.5, 59.5, 69.5, 79.5, 89.5, 95.5),\n                 grade = c("F", "P", "C", "B", "A-", "A", "A+"))\n\ncbind(classA, grade = grades$grade[findInterval(classA$mark, grades$mark)])\n#   id mark grade\n#1 id1 50.0     P\n#2 id2 69.5     B\n#3 id3 45.5     F\n#4 id4 88.0    A-\n#5 id5 98.5    A+\n\ncbind(classA, grade = grades$grade[findInterval(classA$mark, c(-Inf, grades$mark), all.inside = TRUE, left.open = TRUE)])\n  id mark grade\n#1 id1 50.0     C\n#2 id2 69.5     B\n#3 id3 45.5     P\n#4 id4 88.0     A\n#5 id5 98.5    A+\n
Run Code Online (Sandbox Code Playgroud)\n

在 Julia 中,您可以使用searchsortedlastsearchsortedfirst

\n
using DataFrames\n\nclassA = DataFrame(id = ["id1", "id2", "id3", "id4", "id5"],\n                   mark = [50, 69.5, 45.5, 88.0, 98.5]);\ngrades = DataFrame(mark = [0, 49.5, 59.5, 69.5, 79.5, 89.5, 95.5],\n                   grade = ["F", "P", "C", "B", "A-", "A", "A+"]);\n\nclassA[!, "Grade"] = grades.grade[[searchsortedlast(grades.mark, x) for x in classA.mark]]\nclassA\n#5\xc3\x973 DataFrame\n# Row \xe2\x94\x82 id      mark     Grade  \n#     \xe2\x94\x82 String  Float64  String \n#\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n#   1 \xe2\x94\x82 id1        50.0  P\n#   2 \xe2\x94\x82 id2        69.5  B\n#   3 \xe2\x94\x82 id3        45.5  F\n#   4 \xe2\x94\x82 id4        88.0  A-\n#   5 \xe2\x94\x82 id5        98.5  A+\n\nclassA[!, "Grade"] =  grades.grade[min.(length(grades.grade), [searchsortedfirst(grades.mark, x) for x in classA.mark])]\nclassA\n#5\xc3\x973 DataFrame\n# Row \xe2\x94\x82 id      mark     Grade  \n#     \xe2\x94\x82 String  Float64  String \n#\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n#   1 \xe2\x94\x82 id1        50.0  C\n#   2 \xe2\x94\x82 id2        69.5  B\n#   3 \xe2\x94\x82 id3        45.5  P\n#   4 \xe2\x94\x82 id4        88.0  A\n#   5 \xe2\x94\x82 id5        98.5  A+\n
Run Code Online (Sandbox Code Playgroud)\n
\n

与问题中给出的 Julia 相同,包括InMemoryDatasets比较结果

\n
using InMemoryDatasets\n\nclassA = Dataset(id = ["id1", "id2", "id3", "id4", "id5"],\n                        mark = [50, 69.5, 45.5, 88.0, 98.5]);\n\ngrades = Dataset(mark = [0, 49.5, 59.5, 69.5, 79.5, 89.5, 95.5],\n                 grade = ["F", "P", "C", "B", "A-", "A", "A+"]);\n\nclosejoin(classA, grades, on = :mark)\n#5\xc3\x973 Dataset\n# Row \xe2\x94\x82 id        mark      grade    \n#     \xe2\x94\x82 identity  identity  identity \n#     \xe2\x94\x82 String?   Float64?  String?  \n#\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n#   1 \xe2\x94\x82 id1           50.0  P\n#   2 \xe2\x94\x82 id2           69.5  B\n#   3 \xe2\x94\x82 id3           45.5  F\n#   4 \xe2\x94\x82 id4           88.0  A-\n#   5 \xe2\x94\x82 id5           98.5  A+\n\nclosejoin(classA, grades, on = :mark, direction=:forward, border=:nearest)\n#5\xc3\x973 Dataset\n# Row \xe2\x94\x82 id        mark      grade    \n#     \xe2\x94\x82 identity  identity  identity \n#     \xe2\x94\x82 String?   Float64?  String?  \n#\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n#   1 \xe2\x94\x82 id1           50.0  C\n#   2 \xe2\x94\x82 id2           69.5  B\n#   3 \xe2\x94\x82 id3           45.5  P\n#   4 \xe2\x94\x82 id4           88.0  A\n#   5 \xe2\x94\x82 id5           98.5  A+\n
Run Code Online (Sandbox Code Playgroud)\n