Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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:

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

Source of Szabolcs code

share|improve this question
up vote 14 down vote accepted

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"&].

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

share|improve this answer
I gave up on KeyMap because dataset[All,KeyMap[#/."b"->"h"&]] wouldn't work. Is this expected? – C. E. Aug 28 '14 at 17:40
@Pickett I believe it should work, and I reported a bug to WRI. Consider that Dataset[<| a -> 1 |>][KeyMap[f]] works, but Dataset[<| "a" -> 1 |>][KeyMap[f]] doesn't. Looks like a bug to me. – WReach Aug 28 '14 at 17:47
OK, thanks. You have my +1 of course. – C. E. Aug 28 '14 at 17:51
Dataset[Association /@ (Normal@Normal@dataset /. "b" -> "h")]

enter image description here

share|improve this answer
+1 This could also be expressed as dataset[All, Normal /* (# /. "b" -> "h" &) /* Association]. – WReach Aug 28 '14 at 14:58

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.