Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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

share|improve this question

2 Answers 2

up vote 6 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
1  
I gave up on KeyMap because dataset[All,KeyMap[#/."b"->"h"&]] wouldn't work. Is this expected? –  Pickett Aug 28 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 at 17:47
    
OK, thanks. You have my +1 of course. –  Pickett Aug 28 at 17:51
Dataset[Association /@ (Normal@Normal@dataset /. "b" -> "h")]

enter image description here

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

Your Answer

 
discard

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.