'Initialize an empty tibble with column names and 0 rows

I have a vector of column names called tbl_colnames.

I would like to create a tibble with 0 rows and length(tbl_colnames) columns.

The best way I've found of doing this is...

tbl <- as_tibble(data.frame(matrix(nrow=0,ncol=length(tbl_colnames)))

and then I want to name the columns so...

colnames(tbl) <- tbl_colnames.

My question: Is there a more elegant way of doing this?

something like tbl <- tibble(colnames=tbl_colnames)



Solution 1:[1]

my_tibble <- tibble(
  var_name_1 = numeric(),
  var_name_2 = numeric(),
  var_name_3 = numeric(),
  var_name_4 = numeric(),
  var_name_5 = numeric()
)

Haven't tried, but I guess it works too if instead of initiating numeric vectors of length 0 you do it with other classes (for example, character()).

This SO question explains how to do it with other R libraries.

According to this tidyverse issue, this won't be a feature for tribbles.

Solution 2:[2]

For anyone still interested in an elegant way to create a 0-row tibble with column names given by a character vector tbl_colnames:

tbl_colnames %>% purrr::map_dfc(setNames, object = list(logical()))

or:

tbl_colnames %>% purrr::map_dfc(~tibble::tibble(!!.x := logical()))

or:

tbl_colnames %>% rlang::rep_named(list(logical())) %>% tibble::as_tibble()

This, of course, results in each column being of type logical.

Solution 3:[3]

You could abuse readr::read_csv, which allow to read from string. You can control names and types, e.g.:

tbl_colnames <- c("one", "two", "three", "c4", "c5", "last")
read_csv("\n", col_names = tbl_colnames) # all character type
read_csv("\n", col_names = tbl_colnames, col_types = "lcniDT") # various types

Solution 4:[4]

I'm a bit late to the party, but for future readers:

as_tibble(matrix(nrow = 0, ncol = length(tbl_colnames)), .name_repair = ~ tbl_colnames)

.name_repair allows you to name you columns within the same function.

Solution 5:[5]

The following command will create a tibble with 0 row and variables (columns) named with the contents of tbl_colnames

tbl <- tibble::tibble(!!!tbl_colnames, .rows = 0)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3 Marek
Solution 4 Daniël
Solution 5 R Moore