5
$\begingroup$

Very basic question. Probably showing my ignorance, but if I have a dataset like the example in the docs

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" -> {}|>}]

and I want to group by column "b" I type

dataset[GroupBy["b"]]

I get the beautiful result

enter image description here

But if I just want columns "a" and "c", how do I get them? Naively I type

dataset[GroupBy["b"], {"a", "c"}]

but that crashes and burns enter image description here

What's going on? How do I select what columns I want after GroupBy?

$\endgroup$
  • $\begingroup$ Note you get a nested dataset after you GroupBy["b"] $\endgroup$ – yode Jul 18 '17 at 15:53
  • $\begingroup$ So GroupBy doesn't "descend"? $\endgroup$ – Chris Nadovich Jul 18 '17 at 16:44
  • $\begingroup$ Dataset`AscendingQ and Dataset`DescendingQ can tell you it is or not. $\endgroup$ – yode Jul 18 '17 at 16:53
8
$\begingroup$
dataset[GroupBy[Key["b"] -> KeyDrop["b"]]]

or

dataset[GroupBy[Key["b"] -> KeyTake[{"a", "c"}]]]

or

dataset[GroupBy["b"], KeyTake[{"a", "c"}]]

or

dataset[GroupBy["b"], All, {"a", "c"}]
|improve this answer|||||
$\endgroup$
  • $\begingroup$ Thanks for the answer, but it's only half what I'm trying to understand. What specifically is wrong with dataset[GroupBy["b"], {"a", "c"}]? Why is the "All" needed? How would I have known that? What did the error message try to tell me? $\endgroup$ – Chris Nadovich Jul 18 '17 at 15:54
  • $\begingroup$ @ChrisNadovich I try to stay away from explaining to much when it comes to datasets. I failed to grasp details and there are people around who didn't fail while I'm just using them intuitively :) You can hold on with an accept to not discourage those folks from answering. $\endgroup$ – Kuba Jul 19 '17 at 8:29
  • $\begingroup$ Intuition never seems to work for me with these Mathematica Dataset things. I do just fine with SQL intuition, when using SQL, but it leads me to madness here. Anyway, I think I found the answer I was looking for. Group by is considered "descending" (you can look it up!) but it, in fact, does not descend. It's a kind of a non-operator. So that's why the "All" is needed: because All would have been needed to descend past the rows without the GroupBy, so it's still needed. $\endgroup$ – Chris Nadovich Jul 21 '17 at 17:02
4
$\begingroup$

This answer (19542) is incorrect in stating that GroupBy is not a descending operator. Evaluate the following:

ClearAll[f]; 
dataset[GroupBy["b"] /* f]
f[<|"x" -> {<|"a" -> 1, "b" -> "x", "c" -> {1}|>, 
            <|"a" -> 4, "b" -> "x", "c" -> {4, 5}|>}, 
  "y" -> {<|"a" -> 2, "b" -> "y", "c" -> {2, 3}|>, 
          <|"a" -> 5, "b" -> "y", "c" -> {5, 6, 7}|>}, 
  "z" -> {<|"a" -> 3, "b" -> "z", "c" -> {3}|>, 
          <|"a" -> 6, "b" -> "z", "c" -> {}|>}
 |>]

When you GroupBy you add another level to the Association hierarchy. The first level (where f is above) contains the keys of the grouping.

dataset[GroupBy["b"], f]

Mathematica graphics

The second level (where f is above) contains all the records that have been grouped. This is a list of Associations. You must indicate which of these Associations in the list you want to access. In this case all are wanted so All is specified.

dataset[GroupBy["b"], All, f]

Mathematica graphics

f is now at the level where the Associations can be accessed. Here you can enter the keys of the items you wish to return.

dataset[GroupBy["b"], All, {"a", "b"}]

Mathematica graphics

As can be seen from the steps above, GroupBy does act while descending. The issue the OP has (hopefully now: had) is not understanding the affect of effecting GroupBy.

Hope this helps.

|improve this answer|||||
$\endgroup$
2
$\begingroup$

Practical answers are given by @Kuba, but the real answer I was looking for is this.

Even though GroupBy is considered "descending" (you can look it up!), it, in fact, does not descend. It's a kind of a non-operator. So that's why selecting the columns doesn't work in my question.

First I need to start at the top level and move past the rows. So the All is needed: because All would have been needed to descend past the rows without the GroupBy, so it's still needed.

|improve this answer|||||
$\endgroup$

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.