Ubah Named Character Vector menjadi data.frame

87

Saya memiliki vektor karakter bernama yang dikembalikan dari xmlAttrs seperti ini:

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

Saya ingin mengubahnya menjadi bingkai data yang terlihat seperti ini:

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
Tyler Muth
sumber

Jawaban:

86

Sesederhana itu data.frame(as.list(testVect)). Atau jika Anda menginginkan tipe data yang masuk akal untuk kolom Anda data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE),.

Matthew Plourde
sumber
1
Anehnya, analog tibble ini tidak berfungsi: data_frame(as.list(testVect))mengembalikan bingkai data 5 baris.
CoderGuy123
5
@Deleet tibble akan bekerja dengan as_tibble(as.list(testVect))atau as_data_frame(as.list(testVect))( as_data_frameadalah alias untuk as_tibble).
JWilliman
2
Sejalan dengan komentar oleh @Deleet dan @JWillliman, data.table(as.list(...))tidak berfungsi, tetapi berfungsi as.data.table(as.list(...)).
merv
@Matthew Plourde Apakah stringsAsFactors True atau False, ini memberikan tipe data yang sama. Bagaimana cara tidak mengubah tipe data?
AMS
57

Jawaban dari @MatthewPlourde dan @JackRyan berfungsi, tetapi jika Anda memiliki vektor bernama panjang, sangat mengganggu untuk memiliki bingkai data dengan satu baris dan banyak kolom. Jika Anda lebih suka memiliki kolom "kunci" dan kolom "nilai" dengan banyak baris, salah satu dari berikut ini akan berfungsi:

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
dnlbrky.dll
sumber
sedih karena tidak ada satu
kalimat
5
Bisa juga digunakan tibble::enframe(testVect).
JWilliman
2
stack(testVect)juga melakukan ini tetapi membiarkan nilainya sebagai karakter.
Joe
@ Jelena-bioinf sebagai satu-liner dengan sintaks dplyr, Anda dapat menggunakan testVect %>% as.list %>% as.data.frame %>% tidyr::gather()Ini sebenarnya menghasilkan kolom 'kunci' dan 'nilai' yang dirujuk @dnlbrky.
Agile Bean
stack(), sungguh fungsi yang diremehkan!
stevec
18

Saya akan mencoba ini:

test.vector <- as.data.frame(t(testVect))
class(test.vector)
Jack Ryan
sumber
Atau bahkan lebih pendek, cukupdata.frame(t(testVect))
tjebo
3

Aku digunakan untuk menggunakan fungsi disarankan dalam jawaban ini ( as.list, as_tibble, t, enframe, dll) tetapi sejak menemukan bahwa dplyr::bind_rowssekarang bekerja untuk melakukan apa pertanyaan awal bertanya dengan panggilan fungsi tunggal.

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

Dibuat pada 2019-11-10 oleh paket reprex (v0.3.0)

Seperti yang ditunjukkan di tidyverse - cara yang lebih disukai untuk mengubah vektor bernama menjadi data.frame / tibble

Arthur Yip
sumber
0
named vector %>% as_tibble(.,rownames="column name of row.names")
BatmanFan
sumber
Tolong tambahkan penjelasan di sekitar sini agar semua orang bisa belajar. Untuk saat ini, one-liner agak dangkal.
harmonika141