
Příklady k procvičení
Pro cvičení si načtěte soubor tabulek state, který obsahuje údaje 50 států USA.
> data(state)
Vytvoříme datovou tabulku, která bude obsahovat matici state.x77 a údaje o divizi a regionu do kterého stát patří.
> state.fin <- data.frame(state.x77, state=row.names(state.x77), region=state.region, division = state.division, row.names=1:50)
1. Přidejte do tabulky state.fin novou proměnnou, která bude kategorizovat rozlohu států na dvě skupiny (Area) podle průměrné rozlohy (menší nebo rovný průměr a větší než průměr) a nazvěte ji Area.cat.
2. Rekódujte ve stejné tabulce proměnnou Income (průměrný příjem v dolarech) na skupiny <4000, 4000-5000,> 5000.
> head(state.fin)
Population Income Illiteracy Life.Exp Murder HS.Grad Frost Area state region
1 3615 <4000 2.1 69.05 15.1 41.3 20 50708 Alabama South
2 365 >5000 1.5 69.31 11.3 66.7 152 566432 Alaska West
3 2212 4000-5000 1.8 70.55 7.8 58.1 15 113417 Arizona West
4 2110 <4000 1.9 70.66 10.1 39.9 65 51945 Arkansas South
5 21198 >5000 1.1 71.71 10.3 62.6 20 156361 California West
6 2541 4000-5000 0.7 72.06 6.8 63.9 166 103766 Colorado West
division Area.cat
1 East South Central FALSE
2 Pacific TRUE
3 Mountain TRUE
4 West South Central FALSE
5 Pacific TRUE
6 Mountain TRUE
3. Seřaďte řádky tabulky state.fin na základě populace (proměnná Population) od největší po nejmenší.
> state.fin[order(state.fin[,"Population"], decreasing=TRUE),]
]4. U funkce merge()zjistěte funkci argumentů by=, by.x= a by.y=.
Použijeme nápovědu k funkci:
> ?merge
Argumenty by=, by.x= a by.y= se dá specifikovat název sloupce, podle kterého se mají dva soubory spojit v obou (by=) nebo každém souboru zvlášť (by.x= a by.y=).
]
5. V divizích Pacific a Mountain zjistěte počty států, které mají negramotnost (Illiteracy) větší jako průměr USA.
Způsobů řešení je více. Můžeme například nejdříve vytvořit novou kategorickou proměnnou, která rozdělí negramotnost na větší, nebo menší nebo rovno jako průměr. Použijeme k tomu znalosti z kapitoly Přidávání, odstraňování a transformace a rekódování proměnných:
> state.fin<-transform(state.fin, Illiteracy.kat=Illiteracy>mean(Illiteracy))
Nová proměnná je logický vektor, který obsahuje hodnoty TRUE v případě, že je negramotnost větší než průměr USA. Aplikujeme-li součet přes divize, získáme odpověď na otázku. Použijeme funkci aggregate() a vypočteme součet kategorií u všech divizí (viz kapitola Agregace:
> aggregate(x=state.fin$Illiteracy.kat, by=list(state.fin$division), FUN=sum)
Group.1 x
1 New England 1
2 Middle Atlantic 1
3 South Atlantic 6
4 East South Central 4
5 West South Central 3
6 East North Central 0
7 West North Central 0
8 Mountain 2
9 Pacific 2
Divize Pacific a Mountain mají po dvouch státech s negramotností vyšší než je průměr USA.
]6. Připojte k jednotlivým státům souboru state.fin data o násilných trestných činech z datové tabulky USArrests (data(USArrests)) na základě jmen států. Výsledný soubor musí mít na konci stejný počet řádků jako tabulka state.fin.
Využijeme funkci merge() a určíme v každém ze souborů sloupec, který obsahuje jména států. U tabulky USArrests jsou jména států ve sloupcích řádků, proto do argumentu by.y= zadáme hodnotu "row.names":
> state.arrests <- merge(x = state.fin,y=USArrests, all=TRUE, by.x="state", by.y="row.names")
> head(state.arrests)
state Population Income Illiteracy Life.Exp Murder.x HS.Grad Frost Area region
1 Alabama 3615 3624 2.1 69.05 15.1 41.3 20 50708 South
2 Alaska 365 6315 1.5 69.31 11.3 66.7 152 566432 West
3 Arizona 2212 4530 1.8 70.55 7.8 58.1 15 113417 West
4 Arkansas 2110 3378 1.9 70.66 10.1 39.9 65 51945 South
5 California 21198 5114 1.1 71.71 10.3 62.6 20 156361 West
6 Colorado 2541 4884 0.7 72.06 6.8 63.9 166 103766 West
division Illiteracy.kat Murder.y Assault UrbanPop Rape
1 East South Central TRUE 13.2 236 58 21.2
2 Pacific TRUE 10.0 263 48 44.5
3 Mountain TRUE 8.1 294 80 31.0
4 West South Central TRUE 8.8 190 50 19.5
5 Pacific FALSE 9.0 276 91 40.6
6 Mountain FALSE 7.9 204 78 38.7
7. Z tabulky state.fin vytvořte tabulku region.summary o dvou sloupcích, ve které bude každý region reprezentován průměrnou rozlohou (Area) ze všech svých států.
Znovu použijeme jednoduše funkci aggregate():
> region.summary <- aggregate(x=state.fin$Area, by=list(state.fin$region), FUN=mean)
> region.summary
Group.1 x
1 Northeast 18141.00
2 South 54605.12
3 North Central 62652.00
4 West 134463.00
8. Z tabulky state.fin vypočítejte pomocí funkce cast() maxima pouze proměnných Population a Life.Exp uvnitř států.
Nejdříve s pomocí funkce melt()vytvoříme dlouhý soubor. Pomocí argumentu measure.vars= definujeme jako proměnné pouze Population a Life.Exp:
> state.fin.melted<-melt(state.fin, measure.vars=c("Population","Life.Exp")
Using state, region, division as id variables
> head(state.fin.melted)
Income Illiteracy Murder HS.Grad Frost Area state region
1 3624 2.1 15.1 41.3 20 50708 Alabama South
2 6315 1.5 11.3 66.7 152 566432 Alaska West
3 4530 1.8 7.8 58.1 15 113417 Arizona West
4 3378 1.9 10.1 39.9 65 51945 Arkansas South
5 5114 1.1 10.3 62.6 20 156361 California West
6 4884 0.7 6.8 63.9 166 103766 Colorado West
division Illiteracy.kat variable value
1 East South Central TRUE Population 3615
2 Pacific TRUE Population 365
3 Mountain TRUE Population 2212
4 West South Central TRUE Population 2110
5 Pacific FALSE Population 21198
6 Mountain FALSE Population 2541
Pak s pomocí funkce cast() provedeme agregaci:
> popul.lifeexp.max <- cast(state.fin.melted, formula = state~variable, fun.aggregate = max)
> head(popul.lifeexp.max)
state Population Life.Exp
1 Alabama 3615 69.05
2 Alaska 365 69.31
3 Arizona 2212 70.55
4 Arkansas 2110 70.66
5 California 21198 71.71
6 Colorado 2541 72.06
9. Který argument funkce addmargins() kontroluje dimenzi v níž se mají spočítat součty? Je možné definovat i jinou funkci než je frekvence?
Je to argument margin= . Jinou funkci je možné definovat a to s pomocí argumentu FUN=.
]