Bevezetés az R-be 2.0 - Feladatgyűjtemény

Transzformáció

1. feladat. Transzformáció.
A datasets csomag women adattáblája 15 személy magasságát és testsúlyát tartalmazza. Hozzunk létre egy nok adattáblát, amely magyar neveket és mértékegységeket használ az egyes oszlopokban. A hölgyek iskolázottsági fokát új oszlopként szúrjuk be (5 fokú)! A sorneveket változtassuk meg a hölgyek keresztnevére! Három új személy adatát adjuk hozzá az adattáblához. Új oszlopként mérjük a magasságot 3 fokú faktorral! Változtassuk meg az iskolázottság fokát 3 szintűre!

Hozzuk létre a nok adattáblát

nok <- women # data(women) helyett, mert az adattábla neve is változott
str(nok)
'data.frame':    15 obs. of  2 variables:
 $ height: num  58 59 60 61 62 63 64 65 66 67 ...
 $ weight: num  115 117 120 123 126 129 132 135 139 142 ...

Nevezzük át az oszlopokat

names(nok) <- c("magassag", "suly")
str(nok)
'data.frame':    15 obs. of  2 variables:
 $ magassag: num  58 59 60 61 62 63 64 65 66 67 ...
 $ suly    : num  115 117 120 123 126 129 132 135 139 142 ...

Írassuk ki az adattábla első néhány sorát

head(nok, n=4) # az első 4 sor megjelenítése
  magassag suly
1       58  115
2       59  117
3       60  120
4       61  123

Numerikusból numerikus transzformáció

A magasság inch-ben (hüvelyk) a testsúly font-ban (pound) mért az adattáblában. Ezeket a numerikus vektorokat transzformáljuk át cm-ben és kg-ban mért adatokká. Tudjuk, hogy 1 inch = 2.54 cm, illetve 1 font = 0.45359 kg. Ezeket a váltószámokat használva végezzük el a szükséges átalakításokat!

nok$magassag <- nok$magassag * 2.54 # magasság átváltása inch-ből cm-be
nok$suly <- nok$suly * 0.45359 # testsúly átvátása font-ból kg-ba
head(nok, n=4)
  magassag     suly
1   147.32 52.16285
2   149.86 53.07003
3   152.40 54.43080
4   154.94 55.79157

A round() függvénnyel távolítsuk el a tizedeseket

nok$magassag <- round(nok$magassag)
nok$suly <- round(nok$suly)
head(nok, n=4)
  magassag suly
1      147   52
2      150   53
3      152   54
4      155   56

Faktor létrehozása

Tegyük fel, hogy a 15 hölgy iskolázottsági szintje egy 5 fokú faktorban rendelkezésre áll (1-8 általános, 2-szakközépiskola, 3-gimnázium, 4-főiskola, 5-egyetem). Új oszlopként illesszük hozzá a nok adattáblához:

iv <- gl(n=5, k=3) # 15 elemű fiktív iskolai végzettség faktor, 5 szintű
nok$iskolai.vegz <- iv # új oszlop beszúrása
str(nok)
'data.frame':    15 obs. of  3 variables:
 $ magassag    : num  147 150 152 155 157 160 163 165 168 170 ...
 $ suly        : num  52 53 54 56 57 59 60 61 63 64 ...
 $ iskolai.vegz: Factor w/ 5 levels "1","2","3","4",..: 1 1 1 2 2 2 3 3 3 4 ...

Sornevek megváltoztatása

nevek <- c("Ada", "Adelaida", "Adél", "Adela", "Adéla", 
            "Adélia", "Adelin", "Adelina", "Adelgund", "Adelgunda", 
            "Adina", "Alett", "Aletta", "Adelheid", "Alida")
rownames(nok) <- nevek
nok
          magassag suly iskolai.vegz
Ada            147   52            1
Adelaida       150   53            1
Adél           152   54            1
Adela          155   56            2
Adéla          157   57            2
Adélia         160   59            2
Adelin         163   60            3
Adelina        165   61            3
Adelgund       168   63            3
Adelgunda      170   64            4
Adina          173   66            4
Alett          175   68            4
Aletta         178   70            5
Adelheid       180   72            5
Alida          183   74            5

Faktor szintjeinek átnevezése

  1. Alakítsuk át az iskolai végzettség faktorunkat karakteres formára, vagyis ne számokkal jelezzük az egyes szinteket, hanem sokkal beszédesebb címkékkel.
levels(nok$iskolai.vegz) <- c("8.ált", "szak.", "gim.", "főisk.", "egy.")
nok
          magassag suly iskolai.vegz
Ada            147   52        8.ált
Adelaida       150   53        8.ált
Adél           152   54        8.ált
Adela          155   56        szak.
Adéla          157   57        szak.
Adélia         160   59        szak.
Adelin         163   60         gim.
Adelina        165   61         gim.
Adelgund       168   63         gim.
Adelgunda      170   64       főisk.
Adina          173   66       főisk.
Alett          175   68       főisk.
Aletta         178   70         egy.
Adelheid       180   72         egy.
Alida          183   74         egy.

Numrerikusból faktor konverzió

A magasság változó cm-ben kifejezett értékére nem minden esetben van szükségünk. Sokszor gyengébb skálán is mérhetjük ugyanazt a jellemzőt, akkor is megfelelő eredményt kaphatunk. Tegyük fel, hogy egy új oszlopban a magasság jellemző 3 szintű faktorára van szükségünk:

# a 4 osztáspont létrehozása
osztaspontok <- quantile(nok$magassag, probs=c(0,0.33,0.66,1)) 
# karakteres faktorrá alakítjuk az osztáspontok segítségével a magassag oszlopot
nok$magassag.szintek <- cut(nok$magassag, breaks=osztaspontok,
                            labels=c("alacsony","közepes","magas"),
                            include.lowest = T)
str(nok)
'data.frame':    15 obs. of  4 variables:
 $ magassag        : num  147 150 152 155 157 160 163 165 168 170 ...
 $ suly            : num  52 53 54 56 57 59 60 61 63 64 ...
 $ iskolai.vegz    : Factor w/ 5 levels "8.ált","szak.",..: 1 1 1 2 2 2 3 3 3 4 ...
 $ magassag.szintek: Factor w/ 3 levels "alacsony","közepes",..: 1 1 1 1 1 2 2 2 2 2 ...

Faktorból faktor konverzió

Ebben a (hosszúra nyúlt) példában a változó-transzformáció majd minden formájára mutatunk példát. A mértékegységek közötti átváltás során numerikus vektorból numerikus vektort kaptunk, amikor a magasság cm-ben mért értékéből 3 szintű ordinális változót készítettünk, akkor numerikus vektorból faktort állítottunk elő. Egyetlen lehetőség maradt: faktorból faktor előállítása. Erre vegyük azt a példát, hogy az iskolai végzettség mérésére használt 5 szintű faktort 3 szintű faktorral szeretnénk helyettesíteni (1-8 általános, 2-középfokú, 3-felsőfokú).

library(car) # a recode() függvény miatt
nok$iskolai.vegz <- recode(nok$iskolai.vegz, 'c("szak.","gim.")="középf.";
                                              c("főisk.","egy.")="felsőf."')
nok
          magassag suly iskolai.vegz magassag.szintek
Ada            147   52        8.ált         alacsony
Adelaida       150   53        8.ált         alacsony
Adél           152   54        8.ált         alacsony
Adela          155   56      középf.         alacsony
Adéla          157   57      középf.         alacsony
Adélia         160   59      középf.          közepes
Adelin         163   60      középf.          közepes
Adelina        165   61      középf.          közepes
Adelgund       168   63      középf.          közepes
Adelgunda      170   64      felsőf.          közepes
Adina          173   66      felsőf.            magas
Alett          175   68      felsőf.            magas
Aletta         178   70      felsőf.            magas
Adelheid       180   72      felsőf.            magas
Alida          183   74      felsőf.            magas