Konwertuj nazwany wektor znaków na data.frame

86

Mam nazwany wektor znaków zwrócony z xmlAttrs w następujący sposób:

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

Chciałbym przekonwertować go na ramkę danych, która wygląda następująco:

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
źródło

Odpowiedzi:

84

To tak proste, jak data.frame(as.list(testVect)). Lub jeśli chcesz sensowne typy danych dla swoich kolumnach data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE).

Matthew Plourde
źródło
1
Co dziwne, analog tibble tego nie działa: data_frame(as.list(testVect))zwróć 5-wierszową ramkę danych.
CoderGuy123
5
@Deleet tibble będzie działać z as_tibble(as.list(testVect))lub as_data_frame(as.list(testVect))( as_data_framejest aliasem dla as_tibble).
JWilliman
2
Zgodnie z komentarzami @Deleet i @JWillliman, data.table(as.list(...))nie działa, ale zamiast tego as.data.table(as.list(...))działa.
merv
@Matthew Plourde Niezależnie od tego, czy stringsAsFactors True czy False, daje ten sam typ danych. Jak nie zmieniać typu danych?
AMS
56

Odpowiedzi z @MatthewPlourde i @JackRyan działają, ale jeśli masz długi nazwany wektor, denerwujące jest posiadanie ramki danych z jednym wierszem i wieloma kolumnami. Jeśli wolisz mieć kolumnę „klucz” i kolumnę „wartość” z wieloma wierszami, powinno działać dowolne z poniższych:

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
źródło
smutne, że nie ma jednej linii
JelenaČuklina
5
Można również użyć tibble::enframe(testVect).
JWilliman
2
stack(testVect)robi to również, ale pozostawia wartości jako znaki.
Joe
@ Jelena-bioinf jako jednowierszowy ze składnią dplyr, możesz użyć testVect %>% as.list %>% as.data.frame %>% tidyr::gather()To faktycznie tworzy kolumny „klucz” i „wartość”, do których odnosił się @dnlbrky.
Agile Bean
stack()co za niedoceniana funkcja!
stevec
18

Mam zamiar zadać sobie pytanie:

test.vector <- as.data.frame(t(testVect))
class(test.vector)
Jack Ryan
źródło
Albo jeszcze krócej, po prostudata.frame(t(testVect))
Tjebo
3

Ja używałem funkcji sugerowanych w tych odpowiedziach ( as.list, as_tibble, t, enframe, itd.), Ale od tego czasu okazało się, że dplyr::bind_rowspracuje teraz zrobić dokładnie to, co oryginalne pytanie zadaje za pomocą jednego wywołania funkcji.

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

Utworzono 10.11.2019 przez pakiet reprex (v0.3.0)

Jak pokazano na tidyverse - preferowany sposób przekształcenia nazwanego wektora w data.frame / tibble

Arthur Yip
źródło
0
named vector %>% as_tibble(.,rownames="column name of row.names")
BatmanFan
źródło
Dodaj tutaj wyjaśnienie, aby każdy mógł się nauczyć. Na razie jednolinijka jest nieco płytka.
harmonica141