diff --git a/NAMESPACE b/NAMESPACE index 422cbfdd1..955b8ebf2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -37,6 +37,7 @@ export(as_data_frame) export(column_to_rownames) export(data_frame) export(data_frame_) +export(enframe) export(frame_data) export(glimpse) export(has_rownames) diff --git a/R/enframe.R b/R/enframe.R new file mode 100644 index 000000000..b5127600d --- /dev/null +++ b/R/enframe.R @@ -0,0 +1,24 @@ +#' Converting atomic vectors to data frames +#' +#' A helper function that converts named atomic vectors or lists to two-column +#' data frames. +#' For unnamed vectors, the natural sequence is used as name column. +#' +#' @param x An atomic vector +#' @param name,value Names of the columns that store the names and values +#' +#' @return A \code{\link{data_frame}} +#' @export +#' +#' @examples +#' enframe(1:3) +#' enframe(c(a = 5, b = 7)) +enframe <- function(x, name = "name", value = "value") { + if (is.null(names(x))) { + df <- data_frame(seq_along(x), x) + } else { + df <- data_frame(names(x), unname(x)) + } + names(df) <- c(name, value) + df +} diff --git a/man/enframe.Rd b/man/enframe.Rd new file mode 100644 index 000000000..c5ae5616b --- /dev/null +++ b/man/enframe.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/enframe.R +\name{enframe} +\alias{enframe} +\title{Converting atomic vectors to data frames} +\usage{ +enframe(x, name = "name", value = "value") +} +\arguments{ +\item{x}{An atomic vector} + +\item{name, value}{Names of the columns that store the names and values} +} +\value{ +A \code{\link{data_frame}} +} +\description{ +A helper function that converts named atomic vectors or lists to two-column +data frames. +For unnamed vectors, the natural sequence is used as name column. +} +\examples{ +enframe(1:3) +enframe(c(a = 5, b = 7)) +} + diff --git a/tests/testthat/test-enframe.R b/tests/testthat/test-enframe.R new file mode 100644 index 000000000..c27c6c352 --- /dev/null +++ b/tests/testthat/test-enframe.R @@ -0,0 +1,22 @@ +context("enframe") + +test_that("can convert unnamed vector", { + expect_identical(enframe(3:1), + data_frame(name = 1:3, value = 3:1)) +}) + +test_that("can convert named vector", { + expect_identical(enframe(c(a = 2, b = 1)), + data_frame(name = letters[1:2], value = as.numeric(2:1))) +}) + +test_that("can convert zero-length vector", { + expect_identical(enframe(logical()), + data_frame(name = integer(), value = logical())) +}) + +test_that("can use custom names", { + expect_identical(enframe(letters, name = "index", value = "letter"), + data_frame(index = seq_along(letters), + letter = letters)) +})