14
$\begingroup$

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

$\endgroup$
17
$\begingroup$

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

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

enter image description here

$\endgroup$
  • 4
    $\begingroup$ +1 This could also be expressed as dataset[All, Normal /* (# /. "b" -> "h" &) /* Association]. $\endgroup$ – WReach Aug 28 '14 at 14:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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