my_tibble <- function(data) { attr(data, "row.names") <- (1:lengths(data)[1]) attr(data, "class") <- c("tbl_df", "tbl", "data.frame") return(data) } library(tibble) my_tb <- my_tibble(list(x=1:3, y=letters[1:3])) tb <- tibble(x=1:3 , y=letters[1:3]) identical(tb, my_tb) my_factor <- function(data) { lvls <- unique(data) vec <- sapply(data, function(x) match(x, lvls), USE.NAMES=FALSE) attr(vec, "levels") <- lvls attr(vec, "class") <- "factor" return(vec) } my_fac <- my_factor (c("a", "b", "a", "a", "c", "c")) fac <- factor(c("a", "b", "a", "a", "c", "c")) identical(fac, my_fac)