TransWikia.com

Change dataset key name

Mathematica Asked by Mitchell Kaplan on May 7, 2021

Using the example in the documentation, how would I make a new dataset with the key “b” changed to key “h”.

dataset = Dataset[{
   <|"a" -> 1, "b" -> "x", "c" -> {1}|>,
   <|"a" -> 2, "b" -> "y", "c" -> {2, 3}|>,
   <|"a" -> 3, "b" -> "z", "c" -> {3}|>,
   <|"a" -> 4, "b" -> "x", "c" -> {4, 5}|>,
   <|"a" -> 5, "b" -> "y", "c" -> {5, 6, 7}|>,
   <|"a" -> 6, "b" -> "z", "c" -> {}|>}]

I tried:

dataset /. "b"-> "h"

and also

Normal[dataset] /. "b"-> "h"

Which don’t work. This comes up when I get sums using GroupBy. I’m using code from Szabolcs which results in my getting the sums, but they have the same name as the original key. I still don’t really understand the code I’m using so I don’t know how to handle it there, if possible. Eventually I have to use a JoinAcross to merge these totals with the original detail, and I need separate key names.

Szabolcs code is:

sales[
GroupBy[#, KeyTake[{"Country", "Region", "BU", "Year"}] -> KeyTake["Sales"], Total] &
][Normal
][All, Apply[Join]]

Source of Szabolcs code

3 Answers

We can explicitly construct a new association with key names of our choosing:

dataset[All, <| "a" -> "a", "h" -> "b", "c" -> "c" |>]

dataset screenshot

Alternatively, a function could be applied to the keys:

dataset[All, KeyMap[# /. "b" -> "h" &, #] &]

dataset screenshot

Note that a bug in the V10.0.0 type system prevents us from using the operator form KeyMap[# /. "b" -> "h"&]. (2020 Update: in more recent versions we can also write KeyMap[Replace["b" -> "h"]]).

Or, we could explicitly add the key "h" and drop the key "b", although this will re-order the keys in the resultant association:

dataset[All, <| #, "h" -> #b |> & /* KeyDrop["b"]]

dataset screenshot

Or, we could split each association into its keys and values, operate upon the keys, and then thread the results back together into an assocation:

dataset[All, AssociationThread[(Keys@# /. "b" -> "h") -> Values@#] &]

dataset screenshot

Correct answer by WReach on May 7, 2021

Dataset[Association /@ (Normal@Normal@dataset /. "b" -> "h")]

enter image description here

Answered by eldo on May 7, 2021

    dataset = {<|"a" -> 1, "b" -> 2, "c" -> 3, "d" -> 4|>, <|"a" -> 6, 
   "b" -> 5, "c" -> 9, "d" -> 2|>};
    changeKeys[assoc_, suffix_] := KeyMap[# <> suffix &, assoc]
    changeKeys[#, "1"] & /@ dataset

It turns out the in the help file under datasets there is an answer but it currently doesn't work. There must be a bug. The code above works. If some of your datasets are one row (i.e. an association) be sure to put curly brackets around it.

Answered by Martin Hyatt on May 7, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP