Objektumok elemeinek módosítása

Egy objektum elemeinek módosítása tulajdonképpen nem más, mint az indexálás és a hozzárendelés kombinációja.

  • példa egy mátrix oszlopának "felülírására"
( mat <- matrix(1:4, 2, 2) )
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
mat[, 2] <- c(9, 10)
mat
##      [,1] [,2]
## [1,]    1    9
## [2,]    2   10
  • figyeljünk arra, hogy az R a módosításnál is reciklikál
# készítsünk egy vektort, amelyik random sorrendben tartalmazza
# az 1-10 számokat:
( vec <- sample(10) )
##  [1] 10  2  8  7  5  1  9  6  4  3
# cseréljük ki az első négy elemét a 100 és 200 számokra
vec[1:4] <- c(100, 200)
vec
##  [1] 100 200 100 200   5   1   9   6   4   3
  • arra is figyeljünk, hogy az R-ben egy elemi vektor (ide sorolandó a mátrix és a tömb is) csak egyféle típusú (pl. csak integer vagy csak karakter) elemeket tartalmazhat -> az R ezt "észrevétlenül" kikényszeríti!
( vec <- 21:30 )
##  [1] 21 22 23 24 25 26 27 28 29 30
typeof(vec) # lásd ?typeof
## [1] "integer"
vec[1:4] <- 1
typeof(vec)
## [1] "double"
vec[10] <- "30"
typeof(vec)
## [1] "character"
  • ha egy objektum tulajdonságait meg akarjuk tartani, viszont az összes elemét ki akarjuk cserélni, érdemes lehet a következő "fogást" alkalmazni:
# hozzunk létre egy mátrixot, amelyik az 1-9
# egész számokat tartalmazza, és dimenzió-nevei
# is vannak
x <- matrix(1:9, 3, 3, 
            dimnames = list(dimA = letters[1:3], 
                            dimB = LETTERS[1:3]))

# íme:
x
##     dimB
## dimA A B C
##    a 1 4 7
##    b 2 5 8
##    c 3 6 9
# cseréljük ki a mátrix elemeit 9 véletlen (standard 
# normál eloszlású) számmal
x[] <- rnorm(9)

# az eredmény:
x
##     dimB
## dimA          A         B          C
##    a -0.4586827 -0.846736 -0.8918895
##    b -2.0127796  1.283496  0.9607997
##    c -0.3797165  1.109485 -0.2979221
# vesd össze ezzel a megoldással:
( y <- rnorm(9) )
## [1] -1.1324839  1.4626951 -0.4232417 -0.2489515 -0.8126135  0.2154602
## [7] -1.5839960 -0.4587482  0.6288451
dim(y) <- dim(x)
dimnames(y) <- dimnames(x)
y
##     dimB
## dimA          A          B          C
##    a -1.1324839 -0.2489515 -1.5839960
##    b  1.4626951 -0.8126135 -0.4587482
##    c -0.4232417  0.2154602  0.6288451
  • a listák elemeinek módosítása trükkösebb tud lenni:
# hozzunk létre egy egyszerű listát:
( lt <- list(a = 1:3, b = 1:2, c = 1) )
## $a
## [1] 1 2 3
## 
## $b
## [1] 1 2
## 
## $c
## [1] 1
# cseréljük ki az első listaelemet az ábécé első három betűjére
# egyik megoldás:
lt$a <- letters[1:3]

# másik megoldás:
lt[[1]] <- letters[1:3]

# cseréljük ki a 'b' listaelemet egy logikai változóra, a 'c'
# elemet pedig az ábécé első három betűjére, mindezt egyetlen
# lépésben
lt[c("b", "c")] <- list(FALSE, letters[1:3])
  • a lista bármelyik elemét törölhetjük, ha a NULL objektumot rendeljük hozzá:
# töröljük a 'c' elemet:
lt$c <- NULL

# íme az eredmény:
lt
## $a
## [1] "a" "b" "c"
## 
## $b
## [1] FALSE
  • a fentiek fényében találd ki, hogyan lehet módosítani egy data.frame elemeit!

results matching ""

    No results matching ""