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]]
We can explicitly construct a new association with key names of our choosing:
dataset[All, <| "a" -> "a", "h" -> "b", "c" -> "c" |>]
Alternatively, a function could be applied to the keys:
dataset[All, KeyMap[# /. "b" -> "h" &, #] &]
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"]]
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@#] &]
Correct answer by WReach on May 7, 2021
Dataset[Association /@ (Normal@Normal@dataset /. "b" -> "h")]
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP