I have some data from an assignment for Lab 4 for GEO 410 Urban Geography.
In[]:=
mydata=ImportFile
"C:\\Users\\Peter\\urban-geography\\San_Antonio_1910_TableToExcel.csv"
,"Dataset",HeaderLines->1
Out[]=
FID
OBJECTID
STREETNO
STREETDIR
STREETNAME
STREETTYPE
BLOCK
LANDUSE
TOTALSQFT
FLOORS
0
1
210
LOSOYA
STREET
423
RESIDENTIAL
830
1
1
2
224
LOSOYA
STREET
423
RESIDENTIAL
3323
2
2
5
112
BLUM
STREET
151
MIXED USE
3334
1
3
7
113
BONHAM
STREET
151
RESIDENTIAL
726
1
4
8
115
BONHAM
STREET
151
RESIDENTIAL
606
1
5
10
115
NACOGDOCHES
STREET
115
RESIDENTIAL
4948
2
6
11
221
LOSOYA
STREET
416
MIXED USE
11995
2
7
14
308
EAST
HOUSTON
STREET
416
RESIDENTIAL
4432
2
8
15
130
COLLEGE
STREET
405
RESIDENTIAL
1080
1
9
18
112
JEFFERSON
STREET
417
RESIDENTIAL
1051
1
10
19
408
TRAVIS
STREET
417
RESIDENTIAL
2924
2
11
20
203
AVENUE D
421
RESIDENTIAL
1534
1
12
21
205
AVENUE D
421
RESIDENTIAL
2712
2
13
23
224
AVENUE C
421
RESIDENTIAL
2307
2
14
24
218
AVENUE C
421
RESIDENTIAL
1750
1
15
25
216
AVENUE C
421
RESIDENTIAL
3504
2
16
26
210
AVENUE C
421
RESIDENTIAL
4212
2
17
27
202
AVENUE C
421
RESIDENTIAL
2206
2
18
28
233
AVENUE C
420
RESIDENTIAL
5046
2
19
29
231
AVENUE C
420
RESIDENTIAL
3278
2
rows 1–20 of 5856
columns 1–10 of 32
Data not saved. Save now
In[]:=
Query[GroupBy[#"RACE"&],ReverseSort@*CountsBy[#"BIRTHPLACE"&]][mydata]
Out[]=
W
TEXAS
1491
GERMANY
531
MISSOURI
119
ILLINOIS
111
ITALY
103
60 total ›
H
MEXICO
1111
TEXAS
309
SPAIN
3
B
TEXAS
400
MISSISSIPPI
24
LOUISIANA
23
VIRGINIA
22
KENTUCKY
14
23 total ›
NO DATA
TEXAS
4
OHIO
1
PENNSYLVANIA
1
IRELAND
1
VIRGINIA
1
6 total ›
What is the birthplace with the most residents for each race?
In[]:=
Query[GroupBy[#"RACE"&],TakeLargestBy[Identity,1]@*CountsBy[#"BIRTHPLACE"&]][mydata]
Out[]=
W
TEXAS
1491
H
MEXICO
1111
B
TEXAS
400
NO DATA
TEXAS
4
What is the birthplace with the least residents for each race?
In[]:=
Query[GroupBy[#"RACE"&],TakeSmallestBy[Identity,1]@*CountsBy[#"BIRTHPLACE"&]][mydata]
Out[]=
W
SOUTH DAKOTA
1
H
SPAIN
3
B
CALIFORNIA
1
NO DATA
CANADA
1
I’m trying to figure out how to get multiple values for the last one. There is a tie for no data.
In[]:=
Query[GroupBy[#"RACE"&],Values@*CountsBy[#"BIRTHPLACE"&]][mydata]
Out[]=
W
{
…
60
}
H
{309,1111,3}
B
{
…
23
}
NO DATA
{1,1,4,1,1,1}
My code Query[GroupBy[#”RACE”&],TakeSmallestBy[Identity,1]@*CountsBy[#”BIRTHPLACE”&]][mydata] returns only one key but I want it to return all keys with the lowest value.
In[]:=
Query[GroupBy[#"RACE"&],Normal@*CountsBy[#"BIRTHPLACE"&]][mydata]["NO DATA"]//Normal
Out[]=
{CANADA1,VIRGINIA1,TEXAS4,IRELAND1,PENNSYLVANIA1,OHIO1}
I would like something this
In[]:=
Dataset[<|"NO DATA"-><|{"CANADA","VIRGINIA","IRELAND","PENNSYLVANIA","OHIO"}->1|>|>]
Out[]=
NO DATA
CANADA
1
VIRGINIA
IRELAND
PENNSYLVANIA
OHIO
Instead of my output based on my solution with Query[GroupBy[#”RACE”&],TakeSmallestBy[Identity,1]@*CountsBy[#”BIRTHPLACE”&]][mydata].
In[]:=
Dataset[<|"NO DATA"-><|"CANADA"->1|>|>]
Out[]=
NO DATA
CANADA
1
Here is what RankedMax and RankedMin returns. I’m not sure if there is something with tie breaking with TakeLargestBy.
In[]:=
Query[GroupBy[#"RACE"&],RankedMax[Values[#],1]&@*CountsBy[#"BIRTHPLACE"&]][mydata]
Out[]=
W
1491
H
1111
B
400
NO DATA
4
In[]:=
Query[GroupBy[#"RACE"&],RankedMin[Values[#],1]&@*CountsBy[#"BIRTHPLACE"&]][mydata]
Out[]=
W
1
H
3
B
1
NO DATA
1
In[]:=
Association[Query[GroupBy[#"RACE"&],Normal@*CountsBy[#"BIRTHPLACE"&]][mydata]["NO DATA"]//Normal]
Out[]=
CANADA1,VIRGINIA1,TEXAS4,IRELAND1,PENNSYLVANIA1,OHIO1
In[]:=
Map[<|"count"->#|>&][Association[Query[GroupBy[#"RACE"&],Normal@*CountsBy[#"BIRTHPLACE"&]][mydata]["NO DATA"]//Normal]]
Out[]=
CANADAcount1,VIRGINIAcount1,TEXAScount4,IRELANDcount1,PENNSYLVANIAcount1,OHIOcount1
In[]:=
SortBy[#count&][Map[<|"count"->#|>&][Association[Query[GroupBy[#"RACE"&],Normal@*CountsBy[#"BIRTHPLACE"&]][mydata]["NO DATA"]//Normal]]]
Out[]=
CANADAcount1,IRELANDcount1,OHIOcount1,PENNSYLVANIAcount1,VIRGINIAcount1,TEXAScount4
In[]:=
GroupBy[#count&][Map[<|"count"->#|>&][Association[Query[GroupBy[#"RACE"&],Normal@*CountsBy[#"BIRTHPLACE"&]][mydata]["NO DATA"]//Normal]]]
Out[]=
1CANADAcount1,VIRGINIAcount1,IRELANDcount1,PENNSYLVANIAcount1,OHIOcount1,4TEXAScount4
The primary key would be race, birthplace. This could be put in first normal form by using an integer valued id. The table above is not in first normal form. This table is in first normal form with a key.
The minimum is not necessarily unique. For example in the list {1,2,-1} by absolute value there are 2 minimums, 1 and -1. This means minimum is a many to one operation. This was one of the complexities in designing the PositionSmallest and PositionLargest function.
Stephen Wolfram writes about this at https://writings.stephenwolfram.com/2022/12/the-latest-from-our-rd-pipeline-version-13-2-of-wolfram-language-mathematica/#yet-another-little-list-function-