如何在 Julia 中按多列对数据框进行排序

log*_*ick 2 julia

我想按多列对数据框进行排序。这是我制作的一个简单的数据框。如何按不同的排序类型对每一列进行排序?

using DataFrames

DataFrame(b = ("Hi", "Med", "Hi", "Low"),
      levels = ("Med", "Hi", "Low"),
      x = ("A", "E", "I", "O"), y = (6, 3, 7, 2),
      z = (2, 1, 1, 2))
Run Code Online (Sandbox Code Playgroud)

这里移植过来。

Jef*_*off 5

与 R 不同,Julia 的 DataFrame 构造函数期望将每一列中的值作为向量而不是元组传递:so DataFrame(b = ["Hi", "Med", "Hi", "Low"],&tc。

此外,DataFrames 不希望以 R 的方式给出明确的级别。相反,可选的关键字参数categorical可用并且应该设置为“一个 Bool 向量,指示哪些列应该转换为 CategoricalVector”。

(在添加 DataFrames 和 CategoricalArrays 包之后)


julia> using DataFrames, CategoricalArrays

julia> xyorz = categorical(rand(("x","y","z"), 5))
5-element CategoricalArray{String,1,UInt32}:
 "z"
 "y"
 "x"
 "x"
 "z"

julia> smallints = rand(1:4, 5)
5-element Array{Int64,1}:
 2
 3
 2
 1
 1

julia> df = DataFrame(A = 1:5, B = xyorz, C = smallints)
5×3 DataFrame
? Row ? A     ? B            ? C     ?
?     ? Int64 ? Categorical… ? Int64 ?
??????????????????????????????????????
? 1   ? 1     ? z            ? 2     ?
? 2   ? 2     ? y            ? 3     ?
? 3   ? 3     ? x            ? 2     ?
? 4   ? 4     ? x            ? 1     ?
? 5   ? 5     ? z            ? 1     ?
Run Code Online (Sandbox Code Playgroud)

现在,你想排序什么?A上(B然后C)?[4, 3, 2, 5, 1]

julia> sort(df, (:B, :C))
5×3 DataFrame
? Row ? A     ? B            ? C     ?
?     ? Int64 ? Categorical… ? Int64 ?
??????????????????????????????????????
? 1   ? 4     ? x            ? 1     ?
? 2   ? 3     ? x            ? 2     ?
? 3   ? 2     ? y            ? 3     ?
? 4   ? 5     ? z            ? 1     ?
? 5   ? 1     ? z            ? 2     ?

julia> sort(df, (:B, :C)).A
5-element Array{Int64,1}:
 4
 3
 2
 5
 1
Run Code Online (Sandbox Code Playgroud)

这是一个开始的好地方http://juliadata.github.io/DataFrames.jl/stable/