cbind
Kombinování R objektů podle řádků nebo sloupců
cbind {base} | Dokumentace R v češtině |
Popis
Funkce vezme řadu vektorů, metic či datových tabulek a zkombinuje je po řádcích či sloupcích. Jedná se generické funkce s metodami pro mnohé třídy R.
Použití
cbind(..., deparse.level = 1)
rbind(..., deparse.level = 1)
## S3 metoda pro třídu 'data.frame'
rbind(..., deparse.level = 1, make.row.names = TRUE, stringsAsFactors = default.stringsAsFactors())
Argumenty
... |
(obecně) vektory nebo matice. Můžou být zadány jako jmenné argumenty. Ostatní R mohou být vhodně převedeny nebo mohou být použity S4 metody: viz sekce ‘Detaily’ a ‘Hodnota’. (Pro metodu |
deparse.level |
celé číslo, kterým lze ovlivnit utváření štítků v případě argumentů nematicové struktury: |
make.row.names |
(pouze pro |
stringsAsFactors |
logický argument, který se vkládá to funkce |
Detaily
Funkce cbind
a rbind
jsou generické S3 funkce, s metodami pro datové tabulky. Tyto metody jsou použity vždy, když je alespoň jeden z argumentů datová tabulka a zbytek matice či vektory. Jsou zde i další metody; zejména metoda pro objekty typu časových řadT. Viz sekce ‘Vysílání metodh’ pro informaci, jak jsou vybírány patřičné metody, které jsou následně použity. Pokud je některý z argumentů třídy S4, tedy isS4(.)
nabývá pravdivé hodnoty, jsou vyhledány metody S4, a mohou být volány skryté funkce cbind
/ rbind
z balíku methods, které jsou založené na cbind2
, respektive rbind2
. I v tomto případě se funkce řídí nastavenou úrovní deparse.level
.
U vchozí metody musí být všechny vektory/matice buďto atomické, nebo seznamy. Výrazy nejsou povoleny. Objekty jazyka (jako například vzorce či volání) nebo párové seznamy budou převedeny na seznamy: ostatní objekty (např. názvy nebo externí ukazatelé) budou zahrnuty ve výsledném seznamu jako prvky. Všechny třídy, které jsou na vstupu, budou vymazány (zejména pak faktory jsou nahrazeny svými vnitřními kódy).
Pokud se vyskytne více argumentů se strukturrou matice, musí mít všechny stejný počet sloupců (nebo řádků), který zároveň bude počtem sloupců (nebo řádků) výsledku. Pokud jsou všechny argumenty vektory, je počet sloupců (řádků) výsledku roven délce nejdelšího vektoru. Hodnoty z kretších vektorů se tím pádem opakují, aby se délka daného vektoru rovna délce nejdelšího (s varovným hlášením warning
, pokud k opakování dojde pouze u části prvků).
Pokud je mezi argumenty kombinace matic a vektorů, je počet sloupců (řádků) výsledku určen na základě počtu sloupců (řádků) argumentů struktury matice. U všech vektorů pak dojde buď k opakování hodnot, nebo k začlenění hodnot do podmožin, aby se u nich dosáhlo požadované délky.
Funkce cbind
(rbind
) ignoruje vektory o nulové délce (zahrnuje i NULL
), pokud počet sloupců (řádků) výsledku je větší než nula (z důvodu S kompatibility). (Matice s přidanými nulami se v S3 nevyskytují a jsou v R ignorovány.)
Počet sloupců a řásků matic je omezena na méně než 2^31 i v 64-bitovém systému. Také vektory mají stejné omezení na svoji délku. Od verze R 3.2.0 mohou matice na vstupu obsahovat i více prvků (ovšem musí být dodrženo omezení na počet řádků a sloupců).
Hodnota
U výchozí metody je to matice, která vznikla kombinováním argumentů v ...
podle řádků nebo sloupců. (Výjimka: pokud není uveden žádný vstup, nebo jsou všechny vstupy NULL
, pak je i výsledná hodnota NULL
.)
Typ matice je určen datovým typem vstupu, který je nejvýše této hierarchii: raw < logical < integer < double < complex < character < list.
U cbind
(rbind
) jsou názvy sloupců (řádků) brány z colnames
(rownames
) argumentů, které mají strukturu matice. V jiných případech se tyto názvy berou z názvů argumentů, nebo převedením výrazu na řetězec znaků, je-li nastaveno deparse.level > 0
a nejsou zmíněné názvy uvedeny. U deparse.level = 1
dochází k tomuto převodu pouze, pokud je výsledkem smysluplný název (‘symbol’, viz is.symbol
).
U cbind
jsou názvy řádků ve výsledku převzaty od prvního vhodného argumentu: názvy řádků u matice, nebo názvy od vektoru délky, která odpovídá počtu řádků výsledku.
U rbind
jsou názvy sloupců ve výsledku převzaty od prvního vhodného argumentu: názvy sloupců u matice, nebo názvy od vektoru délky, která odpovídá počtu sloupců výsledku.
Metody pro datové tabulky
Metoda "data.frame"
k cbind
je vlastně obalovač pro funkci data.frame(..., check.names = FALSE)
. Znamená to, že dojde k rozdělení matice sloupců u argumentů typu datová tabulka a sloupce řetězců se převedou na faktory, pokud není specifikováno stringsAsFactors = FALSE
.
Metoda "data.frame"
k rbind
nejprve vyřadí všechny argumenty bez řádků či sloupců (pokud žádný nezbude, je navrácen první argument se sloupcema, nebo datová tabulka bez sloupců a řádků). Pak jsou vzaty třídy sloupců první datové tabulky a následně jsou sloupce k sobě přiřazeny podle názvu (je to lepší než podle pozice). U faktorů se úrovně rozšíří dle potřeby a výsledkem je uspořádaný faktor, pokud všechny komponenty byly rovněž uspořádané faktory.
Vysílání metod
Vysílání metod neprobíhá prostřednictvím UseMethod()
, ale c-vnitřním vysíláním. Z toho důvodu není potřeba například rbind.default
.
Vysílací algoritmus je popsán ve zdrojovém souboru (‘.../src/main/bind.c’) a skládá se z následujícíh kroků:
-
Pro každý argument dostaneme seznam možných tříd, ke kterým může patřit.
-
Dále je každá třída prověřena, zda pro ni máme odpovídající metodu.
-
Pokud najdeme vhodnou metodu, ujistíme se, že je shodná pro všechny dřívější argumenty. Shoduje-li se, použijeme ji, v opačném případě se vrátíme k výchozímu kódu.
Pokud chceme kombinovat jiné objekty s datovou tabulkou, může být nezbytné provést nejprve jejich převod na datové tabulky. (Tento algoritmus může vést k volání metody "data.frame"
, pokud jsou všechny argumenty datové tabulky nebo vektory, a výsledkem bude převod vektorů řetězců na faktory.)
Reference
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
Příklady
m <- cbind(1, 1:7) # '1' (= kraší vektor) bude opakována
m
m <- cbind(m, 8:14)[, c(1, 3, 2)] # vložení sloupce
m
cbind(1:7, diag(3)) # vektor je podmnožinou -> varovné hlášení
cbind(0, rbind(1, 1:3))
cbind(I = 0, X = rbind(a = 1, b = 1:3)) # používání názvů
xx <- data.frame(I = rep(0,2))
cbind(xx, X = rbind(a = 1, b = 1:3)) # názvy jinak
cbind(0, matrix(1, nrow = 0, ncol = 4)) #> varování (dává symsl)
dim(cbind(0, matrix(1, nrow = 2, ncol = 0))) #-> 2 x 1
## deparse.level
dd <- 10
rbind(1:4, c = 2, "a++" = 10, dd, deparse.level = 0) # 2 názvy řádků uprostřed
rbind(1:4, c = 2, "a++" = 10, dd, deparse.level = 1) # 3 názvy (default)
rbind(1:4, c = 2, "a++" = 10, dd, deparse.level = 2) # 4 názvy
## názvy řádků:
b0 <- gl(3,4, labels=letters[1:3])
bf <- setNames(b0, paste0("o", seq_along(b0)))
df <- data.frame(a = 1, B = b0, f = gl(4,3))
df. <- data.frame(a = 1, B = bf, f = gl(4,3))
new <- data.frame(a = 8, B ="B", f = "1")
(df1 <- rbind(df , new))
(df.1 <- rbind(df., new))
stopifnot(identical(df1, rbind(df, new, make.row.names=FALSE)),
identical(df1, rbind(df., new, make.row.names=FALSE)))