Darabolás és egyesítés

Gyakran előfordul, hogy bizonyos (faktor)változók mentén fel akarjuk darabolni az adattáblánkat, és ugyanazon elemzéseket akarjuk elvégezni minden egyes résztáblán.

  • pl. a diszlexiás adataink darabolása a csoport változó mentén
data(dyslex)
groups <- split(dyslex, dyslex$csoport)
  • standardizáljuk az olvasás változókat csoportonként
groups <- lapply(groups, 
                 function(x) {
                     vars <- grep("olv_", colnames(x))
                     x[, vars] <- scale(x[, vars])
                     x}
                 )
  • egyesítés egy data.frame-mé
all <- Reduce("rbind", groups)
  • előfordul, hogy van két adattáblánk ugyanazon megfigyelési egységektől származó adatokkal, amelyeket egyesíteni szeretnénk (angolul merge)
# hozzuk megint létre a dyslex_read és dyslex_spell adattáblákat, 
# de most az olvasási adatokat ne szűrjük
dyslex_read <- subset(dyslex, 
                      select = -(sp_helyes1:sp_helyes5))
dyslex_spell <- subset(dyslex, 
                       kor < 145 & oszt <= 4, 
                       select = c(id, sp_helyes1:sp_helyes5))

# egyesítés (csak a közös személyek)
dyslex_merged1 <- merge(dyslex_read, dyslex_spell, by = "id")

# egyesítés (mindenki)
dyslex_merged2 <- merge(dyslex_read, dyslex_spell, by = "id", all = TRUE)

dplyr

  • elemzés csoportok mentén
library(dplyr)
groups <- 
    tbl_df(dyslex) %>%
        group_by(csoport) %>%
        mutate(olv_helyes1 = scale(olv_helyes1), 
               olv_helyes2 = scale(olv_helyes2),
               olv_helyes3 = scale(olv_helyes3))
  • merge
# csak a kozos szemelyekre
inner_merged <- inner_join(dyslex_read, dyslex_spell)

# mindenkire
full_merged <- full_join(dyslex_read, dyslex_spell)

data.table

  • elemzés csoportok mentén
library(data.table)

# egy valtozora
groups <- data.table(dyslex)
groups[, olv_helyes1 := scale(olv_helyes1), by = csoport]

# tobbre
vars <- c("olv_helyes1", "olv_helyes2", "olv_helyes3")
groups <- data.table(dyslex)[,
                             (vars) := scale(get(vars)),
                             by = csoport]
  • merge
# alakitsuk at, hogy data.table legyen
dyslex_read <- setDT(dyslex_read, key = "id")
dyslex_spell <- setDT(dyslex_spell, key = "id")

# a data.table-nek van sajat merge() metodusa, de igy a legtomorebb:
merged1 <- dyslex_read[dyslex_spell]
merged2 <- dyslex_spell[dyslex_read, , nomatch = NA]