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

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),.


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

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)

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


0
named vector %>% as_tibble(.,rownames="column name of row.names")

Tolong tambahkan penjelasan di sekitar sini agar semua orang bisa belajar. Untuk saat ini, one-liner agak dangkal.
harmonika141
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.