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

Faktor

1. feladat. Faktor létrehozása.
Hozzuk létre a 10 személy dohányzási szokására vonatkozó faktort:
"nem dohányzik", "nem dohányzik", "sokat dohányzik", "keveset dohányzik", "keveset dohányzik",
"sokat dohányzik", "nem dohányzik", "keveset dohányzik", "sokat dohányzik", "sokat dohányzik".

Faktor létrehozása numerikus vektor segítségével

# numerikus vektor létrehozása: 1-nem dohányzik; 2-keveset dohányzik; 3-sokat dohányzik
d.sz <- c(1, 1, 3, 2, 2, 3, 1, 2, 3, 3)  
d.sz <- factor(d.sz, labels=c("nem dohányzik", "keveset dohányzik", "sokat dohányzik"))
d.sz; typeof(d.sz); attributes(d.sz)
 [1] nem dohányzik     nem dohányzik     sokat dohányzik   keveset dohányzik keveset dohányzik
 [6] sokat dohányzik   nem dohányzik     keveset dohányzik sokat dohányzik   sokat dohányzik  
Levels: nem dohányzik keveset dohányzik sokat dohányzik
[1] "integer"
$levels
[1] "nem dohányzik"     "keveset dohányzik" "sokat dohányzik"  

$class
[1] "factor"

Faktor létrehozása karakteres vektor segítségével

# numerikus vektor létrehozása: 1-nem dohányzik; 2-keveset dohányzik; 3-sokat dohányzik
d.sz <- c("nem dohányzik", "nem dohányzik", "sokat dohányzik", "keveset dohányzik",
          "keveset dohányzik", "sokat dohányzik", "nem dohányzik", "keveset dohányzik",
          "sokat dohányzik", "sokat dohányzik")  
d.sz <- factor(d.sz, levels=c("nem dohányzik", "keveset dohányzik", "sokat dohányzik"))
d.sz; typeof(d.sz); attributes(d.sz)
 [1] nem dohányzik     nem dohányzik     sokat dohányzik   keveset dohányzik keveset dohányzik
 [6] sokat dohányzik   nem dohányzik     keveset dohányzik sokat dohányzik   sokat dohányzik  
Levels: nem dohányzik keveset dohányzik sokat dohányzik
[1] "integer"
$levels
[1] "nem dohányzik"     "keveset dohányzik" "sokat dohányzik"  

$class
[1] "factor"

2. feladat. Faktor létrehozása.
Hozzuk létre a 10 személy dohányzási szokására vonatkozó faktort:
"nem dohányzik", "nem dohányzik", "nem dohányzik", "nem dohányzik", "keveset dohányzik", "keveset dohányzik", "keveset dohányzik", "keveset dohányzik", "sokat dohányzik", "sokat dohányzik". Figyeljük meg, hogy ez a vektor ismétlődő értékeket tartalmaz!

d.sz <- factor(rep(c("nem dohányzik", "keveset dohányzik", "sokat dohányzik"), 
                   times=c(4, 4, 2)), 
               levels=c("nem dohányzik", "keveset dohányzik", "sokat dohányzik"))
d.sz; typeof(d.sz); attributes(d.sz)
 [1] nem dohányzik     nem dohányzik     nem dohányzik     nem dohányzik     keveset dohányzik
 [6] keveset dohányzik keveset dohányzik keveset dohányzik sokat dohányzik   sokat dohányzik  
Levels: nem dohányzik keveset dohányzik sokat dohányzik
[1] "integer"
$levels
[1] "nem dohányzik"     "keveset dohányzik" "sokat dohányzik"  

$class
[1] "factor"

3. feladat. Faktorszintek sorrendje.
A MASS csomag survey adattáblájában az Exer faktor szintjeit állítsuk a helyes sorrendbe!

data(survey, package = "MASS")
survey$Exer; typeof(survey$Exer); length(survey$Exer); attributes(survey$Exer) # tájékozódás
  [1] Some None None None Some Some Freq Freq Some Some Freq Freq Some Some Some Freq Freq Some Some
 [20] Freq Freq Freq Freq Some Some Some Some Freq Freq Some None Freq Freq Some Some Freq Some Freq
 [39] Some Freq Some Some Some Some Freq Freq Freq None Some None Freq Freq Some Freq Freq Freq None
 [58] Freq Freq Freq Freq Freq Freq None Freq Freq Freq Freq Some None Freq Freq Some Freq Some Freq
 [77] Some Freq Some Freq Some Freq Freq Some Freq Some Some Freq Freq Some Some Some Some Some Freq
 [96] Some Freq Freq Freq Freq Some None Some Freq Some Some Freq Freq Freq Some Freq None Freq Freq
[115] Freq None Some Some Some Freq Freq Freq Freq Freq Freq Freq Freq Freq Freq Some Freq Some Some
[134] Freq Some Some Freq Freq Freq None Some None Freq Some Freq Some Freq Freq Freq Freq Freq Freq
[153] Some Freq None Freq Freq Some None Freq None Some Some Freq Some Some Some Some Freq Freq Some
[172] Some Some Freq Freq Freq Freq Freq Freq Some Freq Freq Some Freq Some Some Some None Freq Freq
[191] Some Some None Some None Some Freq Freq Some Some Some Freq Some None Some Freq Some Some None
[210] Freq Some Some Freq Some Some Some None Freq Freq Freq None Freq Some Freq Some Some Some Freq
[229] Freq Freq Some Some Some Some Some Some Freq
Levels: Freq None Some
[1] "integer"
[1] 237
$levels
[1] "Freq" "None" "Some"

$class
[1] "factor"
# szintek sorrendjének beállítása
survey$Exer <- factor(survey$Exer, levels=c("None", "Some", "Freq")) 
survey$Exer; typeof(survey$Exer); length(survey$Exer); attributes(survey$Exer)
  [1] Some None None None Some Some Freq Freq Some Some Freq Freq Some Some Some Freq Freq Some Some
 [20] Freq Freq Freq Freq Some Some Some Some Freq Freq Some None Freq Freq Some Some Freq Some Freq
 [39] Some Freq Some Some Some Some Freq Freq Freq None Some None Freq Freq Some Freq Freq Freq None
 [58] Freq Freq Freq Freq Freq Freq None Freq Freq Freq Freq Some None Freq Freq Some Freq Some Freq
 [77] Some Freq Some Freq Some Freq Freq Some Freq Some Some Freq Freq Some Some Some Some Some Freq
 [96] Some Freq Freq Freq Freq Some None Some Freq Some Some Freq Freq Freq Some Freq None Freq Freq
[115] Freq None Some Some Some Freq Freq Freq Freq Freq Freq Freq Freq Freq Freq Some Freq Some Some
[134] Freq Some Some Freq Freq Freq None Some None Freq Some Freq Some Freq Freq Freq Freq Freq Freq
[153] Some Freq None Freq Freq Some None Freq None Some Some Freq Some Some Some Some Freq Freq Some
[172] Some Some Freq Freq Freq Freq Freq Freq Some Freq Freq Some Freq Some Some Some None Freq Freq
[191] Some Some None Some None Some Freq Freq Some Some Some Freq Some None Some Freq Some Some None
[210] Freq Some Some Freq Some Some Some None Freq Freq Freq None Freq Some Freq Some Some Some Freq
[229] Freq Freq Some Some Some Some Some Some Freq
Levels: None Some Freq
[1] "integer"
[1] 237
$levels
[1] "None" "Some" "Freq"

$class
[1] "factor"

4. feladat. Faktorszintek neve.
A MASS csomag survey adattáblájában az Exer faktor értékéiet nevezzük át a magyar megfelelőkre!

data(survey, package = "MASS")
survey$Exer; typeof(survey$Exer); length(survey$Exer); attributes(survey$Exer) # tájékozódás
  [1] Some None None None Some Some Freq Freq Some Some Freq Freq Some Some Some Freq Freq Some Some
 [20] Freq Freq Freq Freq Some Some Some Some Freq Freq Some None Freq Freq Some Some Freq Some Freq
 [39] Some Freq Some Some Some Some Freq Freq Freq None Some None Freq Freq Some Freq Freq Freq None
 [58] Freq Freq Freq Freq Freq Freq None Freq Freq Freq Freq Some None Freq Freq Some Freq Some Freq
 [77] Some Freq Some Freq Some Freq Freq Some Freq Some Some Freq Freq Some Some Some Some Some Freq
 [96] Some Freq Freq Freq Freq Some None Some Freq Some Some Freq Freq Freq Some Freq None Freq Freq
[115] Freq None Some Some Some Freq Freq Freq Freq Freq Freq Freq Freq Freq Freq Some Freq Some Some
[134] Freq Some Some Freq Freq Freq None Some None Freq Some Freq Some Freq Freq Freq Freq Freq Freq
[153] Some Freq None Freq Freq Some None Freq None Some Some Freq Some Some Some Some Freq Freq Some
[172] Some Some Freq Freq Freq Freq Freq Freq Some Freq Freq Some Freq Some Some Some None Freq Freq
[191] Some Some None Some None Some Freq Freq Some Some Some Freq Some None Some Freq Some Some None
[210] Freq Some Some Freq Some Some Some None Freq Freq Freq None Freq Some Freq Some Some Some Freq
[229] Freq Freq Some Some Some Some Some Some Freq
Levels: None Some Freq
[1] "integer"
[1] 237
$levels
[1] "None" "Some" "Freq"

$class
[1] "factor"
levels(survey$Exer) <- c("Gyakran", "Soha", "Néha") # faktorszintek átnevezése
survey$Exer; typeof(survey$Exer); length(survey$Exer); attributes(survey$Exer)
  [1] Soha    Gyakran Gyakran Gyakran Soha    Soha    Néha    Néha    Soha    Soha    Néha   
 [12] Néha    Soha    Soha    Soha    Néha    Néha    Soha    Soha    Néha    Néha    Néha   
 [23] Néha    Soha    Soha    Soha    Soha    Néha    Néha    Soha    Gyakran Néha    Néha   
 [34] Soha    Soha    Néha    Soha    Néha    Soha    Néha    Soha    Soha    Soha    Soha   
 [45] Néha    Néha    Néha    Gyakran Soha    Gyakran Néha    Néha    Soha    Néha    Néha   
 [56] Néha    Gyakran Néha    Néha    Néha    Néha    Néha    Néha    Gyakran Néha    Néha   
 [67] Néha    Néha    Soha    Gyakran Néha    Néha    Soha    Néha    Soha    Néha    Soha   
 [78] Néha    Soha    Néha    Soha    Néha    Néha    Soha    Néha    Soha    Soha    Néha   
 [89] Néha    Soha    Soha    Soha    Soha    Soha    Néha    Soha    Néha    Néha    Néha   
[100] Néha    Soha    Gyakran Soha    Néha    Soha    Soha    Néha    Néha    Néha    Soha   
[111] Néha    Gyakran Néha    Néha    Néha    Gyakran Soha    Soha    Soha    Néha    Néha   
[122] Néha    Néha    Néha    Néha    Néha    Néha    Néha    Néha    Soha    Néha    Soha   
[133] Soha    Néha    Soha    Soha    Néha    Néha    Néha    Gyakran Soha    Gyakran Néha   
[144] Soha    Néha    Soha    Néha    Néha    Néha    Néha    Néha    Néha    Soha    Néha   
[155] Gyakran Néha    Néha    Soha    Gyakran Néha    Gyakran Soha    Soha    Néha    Soha   
[166] Soha    Soha    Soha    Néha    Néha    Soha    Soha    Soha    Néha    Néha    Néha   
[177] Néha    Néha    Néha    Soha    Néha    Néha    Soha    Néha    Soha    Soha    Soha   
[188] Gyakran Néha    Néha    Soha    Soha    Gyakran Soha    Gyakran Soha    Néha    Néha   
[199] Soha    Soha    Soha    Néha    Soha    Gyakran Soha    Néha    Soha    Soha    Gyakran
[210] Néha    Soha    Soha    Néha    Soha    Soha    Soha    Gyakran Néha    Néha    Néha   
[221] Gyakran Néha    Soha    Néha    Soha    Soha    Soha    Néha    Néha    Néha    Soha   
[232] Soha    Soha    Soha    Soha    Soha    Néha   
Levels: Gyakran Soha Néha
[1] "integer"
[1] 237
$levels
[1] "Gyakran" "Soha"    "Néha"   

$class
[1] "factor"

5. feladat. Faktorszintek beállítása.
Öt diák nemét szeretnénk tárolni a "fiú" és "lány" címkék segítségével. Az öt véletlenszerűen választott diák neme: "fiú", "fiú", "fiú", "fiú", "fiú". Hozzuk létre a faktort egy karakteres vektor egyszerű konverziójával. Próbáljuk átírni az első személy nemét "lány"-ra. Hogyan kell létrehozni a faktort, hogy ezt megtehessük?

nem <- c("fiú", "fiú", "fiú", "fiú", "fiú")
nem <- factor(nem)
nem; typeof(nem); length(nem); attributes(nem) # tájékozódás
[1] fiú fiú fiú fiú fiú
Levels: fiú
[1] "integer"
[1] 5
$levels
[1] "fiú"

$class
[1] "factor"
# az 1. elem értékének megváltoztatása
nem[1] <- "lány"
Warning in `[<-.factor`(`*tmp*`, 1, value = "lány"): invalid factor level, NA generated
nem; typeof(nem); length(nem); attributes(nem) # tájékozódás
[1] <NA> fiú  fiú  fiú  fiú 
Levels: fiú
[1] "integer"
[1] 5
$levels
[1] "fiú"

$class
[1] "factor"
# megoldás
nem <- c("fiú", "fiú", "fiú", "fiú", "fiú")
nem <- factor(nem, levels=c("fiú", "lány")) # 2 szintű faktor létrehozása
nem; typeof(nem); length(nem); attributes(nem)
[1] fiú fiú fiú fiú fiú
Levels: fiú lány
[1] "integer"
[1] 5
$levels
[1] "fiú"  "lány"

$class
[1] "factor"
# az 1. elem értékének sikeres megváltoztatása
nem[1] <- "lány"
nem; typeof(nem); length(nem); attributes(nem)
[1] lány fiú  fiú  fiú  fiú 
Levels: fiú lány
[1] "integer"
[1] 5
$levels
[1] "fiú"  "lány"

$class
[1] "factor"

6. feladat. Nem használt faktorszintek eldobása.
Adjunk példát a nem használt faktorszintek eldobására a droplevels() függvény segítségével!

A <- c("a", "a", "b", "b", "c")
B <- c(12, 13, 14, 15, 21)
d <- data.frame(A, B) # adattábla létrehozása
d
  A  B
1 a 12
2 a 13
3 b 14
4 b 15
5 c 21
d$A; typeof(d$A); length(d$A); attributes(d$A) # tájékozódás
[1] a a b b c
Levels: a b c
[1] "integer"
[1] 5
$levels
[1] "a" "b" "c"

$class
[1] "factor"
d.2 <- d[ d$A!="a", ] # szűrés
d.2
  A  B
3 b 14
4 b 15
5 c 21
d.2$A <- droplevels(d.2$A) # nem használt faktorszintek eldobása (faktorszintű megoldás)
d.2$A; typeof(d.2$A); length(d.2$A); attributes(d.2$A)
[1] b b c
Levels: b c
[1] "integer"
[1] 3
$levels
[1] "b" "c"

$class
[1] "factor"
d.2 <- d[ d$A!="a", ] # szűrés
d.2
  A  B
3 b 14
4 b 15
5 c 21
d.2 <- droplevels(d.2) # nem használt faktorszintek eldobása (adattábla szintű megoldás)
d.2$A; typeof(d.2$A); length(d.2$A); attributes(d.2$A)
[1] b b c
Levels: b c
[1] "integer"
[1] 3
$levels
[1] "b" "c"

$class
[1] "factor"