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 中做到这一点?
在R中,可以通过使用findInterval.
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+\nRun Code Online (Sandbox Code Playgroud)\n在 Julia 中,您可以使用searchsortedlast和searchsortedfirst。
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+\nRun Code Online (Sandbox Code Playgroud)\n与问题中给出的 Julia 相同,包括InMemoryDatasets比较结果。
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+\nRun Code Online (Sandbox Code Playgroud)\n