Convert Named Character Vector to data.frame
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")
Related videos on Youtube
Comments
-
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 over 6 yearssad that there's no one-liner
-
CoderGuy123 about 6 yearsOddly, the tibble analog of this does not work:
data_frame(as.list(testVect))
return a 5 row data frame. -
JWilliman about 6 years@Deleet tibble will work with
as_tibble(as.list(testVect))
oras_data_frame(as.list(testVect))
(as_data_frame
is an alias foras_tibble
). -
JWilliman about 6 yearsCan also use
tibble::enframe(testVect)
. -
merv almost 6 yearsIn line with comments by @Deleet and @JWillliman,
data.table(as.list(...))
does not work, but insteadas.data.table(as.list(...))
does. -
Joe over 5 years
stack(testVect)
also does this but leaves the values as characters. -
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 about 5 yearsOr even shorter, simply
data.frame(t(testVect))
-
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 almost 4 years
stack()
, what an underrated function! -
harmonica141 over 3 yearsPlease add some explanation around here so everybody can learn. As of now a one-liner is a bit shallow.
-
Amer over 3 yearsThank you, that was sueful!
-
Esmu Igors over 2 yearsNote 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 almost 2 yearsstack is amazing, but it fails when your vector is not a vector ... ;) stackoverflow.com/questions/72398317/…