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

如何在Julia中按多列对数据帧进行排序,julia,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)) 您的代码正在创建一个包含元组的单行数据帧,因此我更正了它。

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

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

您的代码正在创建一个包含元组的单行数据帧,因此我更正了它。 注意,对于标称变量,通常使用
Symbol
s而不是
String
s

using DataFrames
df = DataFrame(b = [:Hi, :Med, :Hi, :Low, :Hi],
               x = ["A", "E", "I", "O","A"], 
               y = [6, 3, 7, 2, 1],
               z = [2, 1, 1, 2, 2])

sort(df, [:z,:y])

与R不同,Julia的DataFrame构造函数期望每列中的值作为向量而不是元组传递:因此
DataFrame(b=[“Hi”、“Med”、“Hi”、“Low”],
&tc

此外,DataFrames不希望以R的方式给出显式级别。相反,可选的关键字参数
category
可用,应设置为“Bool向量,指示哪些列应转换为CategorialVector”

(添加数据帧和CategoricalArray包后)

现在,您想排序什么?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

这是一个很好的起点

Jeffrey,我特别欣赏“从R开始”的方法,这对我(我希望还有其他人)来说是完美的。在上面,帧引用使用了向量
[:z,:y]
来代替元组
(:B,:C)
。而我猜这更像是一种“轻微的效率”问题是,在向量上使用元组还有另一个令人信服的原因吗?在DataFrames.jl中,一般的设计是使用向量。在这种情况下,允许使用元组,但不会增加效率,因为在内部它会被转换为向量。另外,Jeffrey Sarnoff暗示,对于标称或序数列,典型的方法是uld应使用分类导航器。
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