1. feladat. Transzformáció.
Adatasets
csomagwomen
adattáblája 15 személy magasságát és testsúlyát tartalmazza. Hozzunk létre egynok
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!
nok
adattáblátnok <- 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 ...
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 ...
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
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
round()
függvénnyel távolítsuk el a tizedeseketnok$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
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 ...
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
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.
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 ...
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