Question about transpose dataframe?

Dear all,

How to transpose the dataframe below,

julia> df
3×7 DataFrame
 Row │ year    2000   2001   2002   2003   2004   2005
     │ String  Int64  Int64  Int64  Int64  Int64  Int64
─────┼──────────────────────────────────────────────────
   1 │ x         317    314    306    304    292    275
   2 │ y         766    779    808    785    794    799
   3 │ z         679    686    697    688    704    699

And I want to transpose it to

 Row │ year   x      y      z
     │ Int64  Int64  Int64  Int64
─────┼────────────────────────────
   1 │  2000    317    766    679
   2 │  2001    314    779    686
   3 │  2002    306    808    697
   4 │  2003    304    785    688
   5 │  2004    292    794    704
   6 │  2005    275    799    699

I try to use permutedims, but it gets an error.

julia> permutedims!(df, 1)
ERROR: MethodError: no method matching permutedims!(::DataFrame, ::Int64)
Closest candidates are:
  permutedims!(::Any, ::AbstractArray, ::Any) at /Applications/Julia-1.7.app/Contents/Resources/julia/share/julia/base/permuteddimsarray.jl:204
Stacktrace:
 [1] top-level scope
   @ REPL[247]:1

Here is my solution, but a little complex.

julia> df = CSV.read("d51.txt", DataFrame)
3×6 DataFrame
 Row │ 2000   2001   2002   2003   2004   2005
     │ Int64  Int64  Int64  Int64  Int64  Int64
─────┼──────────────────────────────────────────
   1 │   317    314    306    304    292    275
   2 │   766    779    808    785    794    799
   3 │   679    686    697    688    704    699

julia> year = parse.(Int, names(df))
6-element Vector{Int64}:
 2000
 2001
 2002
 2003
 2004
 2005

julia> data = hcat(year, Matrix(df)')
6×4 Matrix{Int64}:
 2000  317  766  679
 2001  314  779  686
 2002  306  808  697
 2003  304  785  688
 2004  292  794  704
 2005  275  799  699

julia> df = DataFrame(data, ["year", "x", "y", "z"])
6×4 DataFrame
 Row │ year   x      y      z
     │ Int64  Int64  Int64  Int64
─────┼────────────────────────────
   1 │  2000    317    766    679
   2 │  2001    314    779    686
   3 │  2002    306    808    697
   4 │  2003    304    785    688
   5 │  2004    292    794    704
   6 │  2005    275    799    699

permutedims works, the ! usually means in-place which isn’t possible here.

2 Likes

Thanks very much. It works well.