Convert Named Character Vector to data.frame

87,143

Solution 1

It's as simple as data.frame(as.list(testVect)). Or if you want sensible data types for your columns, data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE).

Solution 2

The answers from @MatthewPlourde and @JackRyan work, but if you have a long named vector it is annoying to have a data frame with one row and many columns. If you'd rather have a "key" column and a "value" column with many rows, any of the following should work:

data.frame(keyName=names(testVect), value=testVect, row.names=NULL)

##        keyName      value
## 1   db_version 11.2.0.3.0
## 2 elapsed_time      12.89
## 3     cpu_time      12.71


## Suggested by @JWilliman
tibble::enframe(testVect)

## # A tibble: 3 x 2
##   name         value
##   <chr>        <chr>
## 1 db_version   11.2.0.3.0
## 2 elapsed_time 12.89
## 3 cpu_time     12.71


## Suggested by @Joe
stack(testVect)
##       values          ind
## 1 11.2.0.3.0   db_version
## 2      12.89 elapsed_time
## 3      12.71     cpu_time

Solution 3

I'm going to take a stab at this:

test.vector <- as.data.frame(t(testVect))
class(test.vector)

Solution 4

I used to use the functions suggested in these answers (as.list, as_tibble, t, enframe, etc.) but have since found out that dplyr::bind_rows now works to do exactly what the original question asks with a single function call.

library(dplyr)
testVect <- structure(c("11.2.0.3.0", "12.89", "12.71"), .Names = c("db_version", "elapsed_time", "cpu_time"))
testVect %>% bind_rows
#> # A tibble: 1 x 3
#>   db_version elapsed_time cpu_time
#>   <chr>      <chr>        <chr>   
#> 1 11.2.0.3.0 12.89        12.71

Created on 2019-11-10 by the reprex package (v0.3.0)

As shown in tidyverse - prefered way to turn a named vector into a data.frame/tibble

Solution 5

named vector %>% as_tibble(.,rownames="column name of row.names")
Share:
87,143

Related videos on Youtube

Tyler Muth
Author by

Tyler Muth

Chief Database Engineer, Oracle Public Sector

Updated on February 22, 2021

Comments

  • Tyler Muth
    Tyler Muth about 3 years

    I have a named character vector returned from xmlAttrs like this:

    testVect <- structure(c("11.2.0.3.0", "12.89", "12.71"), .Names = c("db_version", 
                 "elapsed_time", "cpu_time"))
    

    I would like to convert it to a data frame that looks like this:

    testDF <- data.frame("db_version"="11.2.0.3.0","elapsed_time"=12.89,"cpu_time"=12.71)
    head(testDF)
      db_version elapsed_time cpu_time
    1 11.2.0.3.0        12.89    12.71
    
  • JelenaČuklina
    JelenaČuklina over 6 years
    sad that there's no one-liner
  • CoderGuy123
    CoderGuy123 about 6 years
    Oddly, the tibble analog of this does not work: data_frame(as.list(testVect)) return a 5 row data frame.
  • JWilliman
    JWilliman about 6 years
    @Deleet tibble will work with as_tibble(as.list(testVect)) or as_data_frame(as.list(testVect)) (as_data_frame is an alias for as_tibble).
  • JWilliman
    JWilliman about 6 years
    Can also use tibble::enframe(testVect).
  • merv
    merv almost 6 years
    In line with comments by @Deleet and @JWillliman, data.table(as.list(...)) does not work, but instead as.data.table(as.list(...)) does.
  • Joe
    Joe over 5 years
    stack(testVect) also does this but leaves the values as characters.
  • Agile Bean
    Agile Bean over 5 years
    @Jelena-bioinf as one-liner with dplyr syntax, you can use testVect %>% as.list %>% as.data.frame %>% tidyr::gather() This actually produces the 'key' and 'value' columns which @dnlbrky referred to.
  • tjebo
    tjebo about 5 years
    Or even shorter, simply data.frame(t(testVect))
  • AMS
    AMS almost 4 years
    @Matthew Plourde Whether stringsAsFactors True or False, it gives the same data type. How to not change the data type?
  • stevec
    stevec almost 4 years
    stack(), what an underrated function!
  • harmonica141
    harmonica141 over 3 years
    Please add some explanation around here so everybody can learn. As of now a one-liner is a bit shallow.
  • Amer
    Amer over 3 years
    Thank you, that was sueful!
  • Esmu Igors
    Esmu Igors over 2 years
    Note to novices like me: this creates a df with 2 columns, one named "name" (with names as data, not row.names) and one named "value". I understand that OP meant precisely this but I came here searching for another but similar problem and spent a long time trying to figure out why this method produced strange results...
  • tjebo
    tjebo almost 2 years
    stack is amazing, but it fails when your vector is not a vector ... ;) stackoverflow.com/questions/72398317/…