我想按多列对数据框进行排序。这是我制作的一个简单数据框。如何按不同的排序类型对每一列进行排序?
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))
从here移植过来。
答案 0 :(得分:2)
您的代码正在创建包含元组的单行DataFrame
,因此我进行了更正。
请注意,对于名义变量,通常应使用Symbol
而不是String
。
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])
答案 1 :(得分:2)
与R不同,Julia的DataFrame构造函数期望每列中的值作为矢量而不是作为元组传递:因此DataFrame(b = ["Hi", "Med", "Hi", "Low"],
&tc。
此外,DataFrames也不希望以R的方式给出明确的级别。而是可以使用可选的关键字参数categorical
,并将其设置为“ Bool的向量,指示应将哪些列转换为CategoricalVector”。
(添加了DataFrame和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 │
现在,您要排序什么? 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
的好地方