-----Original Message-----
From: Mulholland, Tom
Sent: Tuesday, 22 March 2005 1:35 PM
To: R-Help (E-mail)
Subject: [R] List of tables rather than an extra dimension in
the table
or (l)apply(xtabs)
I'm not sure how to best explain what I am after but here
goes. I have a data frame with 2 geographical factors. One is
the major region the other is the component regions.
I am trying to process all the regions at the same time
without using "for". So I need (think, I do) a list of
matrices each structured according to the number of
subregions within each region.
So is there a way of using lapply with xtabs or is there a
better way to achieve my desired output?
Using the Titanic data as an example
t1 <- as.data.frame(Titanic)
t2 <- split(t1,t1$Class)
# I would then drop any unused levels in the factors for the
geography creating distinctly different data.frames (see end
of message)
xtabs(Freq ~ Age + Sex + Class,t1)
, , Class = 1st
Sex
Age Male Female
Child 5 1
Adult 175 144
, , Class = 2nd
Sex
Age Male Female
Child 11 13
Adult 168 93
, , Class = 3rd
Sex
Age Male Female
Child 48 31
Adult 462 165
, , Class = Crew
Sex
Age Male Female
Child 0 0
Adult 862 23
Can I do something with t2 to produce a list which is in
effect an Age by Sex crosstab with one item for each value of
Class. I would be wanting to drop.unused.levels, so that the
last part of the table is just
Sex
Age Male Female
Adult 862 23
or in my case each item in the list has the same number of
rows as there are subregions for that region.
List of 9
$ 1:`data.frame': 4009 obs. of 7 variables:
..$ sex : Factor w/ 2 levels "Females","Males": 2 2 2
2 2 2 2 2 2 2 ...
..$ age : Factor w/ 18 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ lga : Factor w/ 23 levels "Carnamah (S)",..: 1 2 3
4 5 6 7 8 9 10 ... # 23 subregions
..$ psn : num [1:4009] 71 336 26 84 30 133 904 385 99 110 ...
..$ year : num [1:4009] 1991 1991 1991 1991 1991 ...
..$ agecomp : Factor w/ 14 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ RegionNum: num [1:4009] 1 1 1 1 1 1 1 1 1 1 ...
$ 2:`data.frame': 720 obs. of 7 variables:
..$ sex : Factor w/ 2 levels "Females","Males": 2 2 2
2 2 2 2 2 2 2 ...
..$ age : Factor w/ 18 levels "0-4","5-9","10-14",..:
1 1 1 1 2 2 2 2 3 3 ...
..$ lga : Factor w/ 4 levels "Broome (S)","De..",..: 1
2 3 4 1 2 3 4 1 2 ... # 4 subregions etc
..$ psn : num [1:720] 495 445 189 377 415 374 189 330
324 319 ...
..$ year : num [1:720] 1991 1991 1991 1991 1991 ...
..$ agecomp : Factor w/ 14 levels "0-4","5-9","10-14",..:
1 1 1 1 2 2 2 2 3 3 ...
..$ RegionNum: num [1:720] 2 2 2 2 2 2 2 2 2 2 ...
So these two items would produce
round(xtabs(psn ~ lga + agecomp,eas[[1]]),-2)
agecomp
lga 0-4 5-9 10-14 15-19 20-24 25-29
30-34 35-39 40-44 45-49 50-54 55-59 60-64 65plus
Carnamah (S) 500 400 300 200 300 300
500 400 400 300 300 200 100 300
Carnarvon (S) 2800 3000 2600 2100 2400 2700
2800 2600 2400 2200 2000 1600 1300 2800
Chapman Valley (S) 300 400 300 200 200 300
300 300 300 400 400 300 200 300
Coorow (S) 700 700 600 200 300 600
700 600 500 500 400 400 300 500
Cue (S) 200 200 100 100 200 200
300 200 200 200 200 100 100 100
Exmouth (S) 900 1000 800 600 700 1100
1100 1100 1100 800 700 500 400 700
Geraldton (C) 7700 7700 8100 8200 7200 7400
7500 7200 6900 6100 5400 4600 4300 12400
Greenough (S) 4700 5400 5500 4400 3100 3700
4800 5100 5200 4200 3500 2600 1900 3200
Irwin (S) 1000 1100 1000 600 600 900
1000 1200 1000 900 800 900 800 1800
Meekatharra (S) 800 700 600 600 900 1000
900 700 600 500 400 300 200 400
Mingenew (S) 300 300 200 100 200 200
300 300 200 200 200 200 100 200
Morawa (S) 400 500 400 400 200 400
500 400 300 300 300 300 200 500
Mount Magnet (S) 500 400 300 200 400 500
400 400 300 300 200 200 100 200
Mullewa (S) 600 600 800 400 400 500
500 400 300 300 300 300 200 400
Murchison (S) 100 100 100 100 0 100
100 0 0 0 100 0 0 0
Northampton (S) 1300 1300 1200 700 700 900
1200 1300 1200 1200 1000 1000 900 2000
Perenjori (S) 300 300 300 100 200 200
300 300 300 200 200 200 100 300
Sandstone (S) 0 0 0 0 100 100
100 100 100 100 100 100 0 100
Shark Bay (S) 300 300 200 200 200 300
400 400 400 300 300 300 200 600
Three Springs (S) 300 300 300 100 200 300
400 300 300 200 300 200 200 400
Upper Gascoyne (S) 100 200 200 100 100 100
100 100 100 100 100 100 100 100
Wiluna (S) 200 200 200 300 600 700
600 400 300 300 300 200 100 100
Yalgoo (S) 100 100 100 0 200 200
200 100 200 200 100 100 100 100
round(xtabs(psn ~ lga + agecomp,eas[[2]]),-2)
agecomp
lga 0-4 5-9 10-14 15-19 20-24
25-29 30-34 35-39 40-44 45-49 50-54 55-59 60-64 65plus
Broome (S) 5600 5400 4500 3900 4900 5800
6100 5500 4500 3700 2800 2000 1500 2200
Derby-West Kimberley (S) 4000 3900 3400 3100 3800 4000
3800 3100 2500 1900 1500 1200 900 1800
Halls Creek (S) 2100 2100 1700 1600 1800 1600
1400 1100 1000 900 700 600 400 800
Wyndham-East Kimberley (S) 3500 3300 2800 2300 2900 3500
3500 3000 2600 2100 1800 1300 800 1200
$ 3:`data.frame': 2130 obs. of 7 variables:
..$ sex : Factor w/ 2 levels "Females","Males": 2 2 2
2 2 2 2 2 2 2 ...
..$ age : Factor w/ 18 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ lga : Factor w/ 12 levels "Albany (C)","Br..",..:
1 2 3 4 5 6 7 8 9 10 ...
..$ psn : num [1:2130] 1107 21 63 167 115 ...
..$ year : num [1:2130] 1991 1991 1991 1991 1991 ...
..$ agecomp : Factor w/ 14 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ RegionNum: num [1:2130] 3 3 3 3 3 3 3 3 3 3 ...
$ 4:`data.frame': 5188 obs. of 7 variables:
..$ sex : Factor w/ 2 levels "Females","Males": 2 2 2
2 2 2 2 2 2 2 ...
..$ age : Factor w/ 18 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ lga : Factor w/ 29 levels "Beverley (S)",..: 1 2 3
4 5 6 7 8 9 10 ...
..$ psn : num [1:5188] 55 58 84 90 105 134 57 132 56 70 ...
..$ year : num [1:5188] 1991 1991 1991 1991 1991 ...
..$ agecomp : Factor w/ 14 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ RegionNum: num [1:5188] 4 4 4 4 4 4 4 4 4 4 ...
$ 5:`data.frame': 5400 obs. of 7 variables:
..$ sex : Factor w/ 2 levels "Females","Males": 2 2 2
2 2 2 2 2 2 2 ...
..$ age : Factor w/ 18 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ lga : Factor w/ 30 levels "Armadale (C)",..: 1 2 3
4 5 6 7 8 9 10 ...
..$ psn : num [1:5400] 2163 479 1824 865 749 ...
..$ year : num [1:5400] 1991 1991 1991 1991 1991 ...
..$ agecomp : Factor w/ 14 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ RegionNum: num [1:5400] 5 5 5 5 5 5 5 5 5 5 ...
$ 6:`data.frame': 720 obs. of 7 variables:
..$ sex : Factor w/ 2 levels "Females","Males": 2 2 2
2 2 2 2 2 2 2 ...
..$ age : Factor w/ 18 levels "0-4","5-9","10-14",..:
1 1 1 1 2 2 2 2 3 3 ...
..$ lga : Factor w/ 4 levels "Ashburton (S)",..: 1 2 3
4 1 2 3 4 1 2 ...
..$ psn : num [1:720] 532 624 699 930 433 539 689 846
320 379 ...
..$ year : num [1:720] 1991 1991 1991 1991 1991 ...
..$ agecomp : Factor w/ 14 levels "0-4","5-9","10-14",..:
1 1 1 1 2 2 2 2 3 3 ...
..$ RegionNum: num [1:720] 6 6 6 6 6 6 6 6 6 6 ...
$ 7:`data.frame': 1601 obs. of 7 variables:
..$ sex : Factor w/ 2 levels "Females","Males": 2 2 2
2 2 2 2 2 2 2 ...
..$ age : Factor w/ 18 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 2 ...
..$ lga : Factor w/ 9 levels "Coolgardie ..",..: 1 2 3
4 5 6 7 8 9 1 ...
..$ psn : num [1:1601] 342 105 534 1352 85 ...
..$ year : num [1:1601] 1991 1991 1991 1991 1991 ...
..$ agecomp : Factor w/ 14 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 2 ...
..$ RegionNum: num [1:1601] 7 7 7 7 7 7 7 7 7 7 ...
$ 8:`data.frame': 2880 obs. of 7 variables:
..$ sex : Factor w/ 2 levels "Females","Males": 2 2 2
2 2 2 2 2 2 2 ...
..$ age : Factor w/ 18 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ lga : Factor w/ 16 levels "Augusta-Mar..",..: 1 2
3 4 5 6 7 8 9 10 ...
..$ psn : num [1:2880] 294 66 85 188 1144 ...
..$ year : num [1:2880] 1991 1991 1991 1991 1991 ...
..$ agecomp : Factor w/ 14 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ RegionNum: num [1:2880] 8 8 8 8 8 8 8 8 8 8 ...
$ 9:`data.frame': 2694 obs. of 7 variables:
..$ sex : Factor w/ 2 levels "Females","Males": 2 2 2
2 2 2 2 2 2 2 ...
..$ age : Factor w/ 18 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ lga : Factor w/ 15 levels "Brookton (S)",..: 1 2 3
4 5 6 7 9 8 10 ...
..$ psn : num [1:2694] 49 67 38 46 67 51 104 214 44 69 ...
..$ year : num [1:2694] 1991 1991 1991 1991 1991 ...
..$ agecomp : Factor w/ 14 levels "0-4","5-9","10-14",..:
1 1 1 1 1 1 1 1 1 1 ...
..$ RegionNum: num [1:2694] 9 9 9 9 9 9 9 9 9 9 ...
platform i386-pc-mingw32
arch i386
os mingw32
system i386, mingw32
status
major 2
minor 0.1
year 2004
month 11
day 15
language R
Tom Mulholland
Senior Demographer
Spatial Information and Research
State and Regional Policy
Department for Planning and Infrastructure
Perth, Western Australia
+61 (08) 9264 7936