Konvertieren Sie den benannten Zeichenvektor in data.frame

85

Ich habe einen benannten Zeichenvektor von xmlAttrs wie folgt zurückgegeben:

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

Ich möchte es in einen Datenrahmen konvertieren, der so aussieht:

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
quelle

Antworten:

84

Es ist so einfach wie data.frame(as.list(testVect)). Oder wenn Sie sinnvolle Datentypen für Ihre Spalten wünschen , data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE).

Matthew Plourde
quelle
1
Seltsamerweise funktioniert das Tibble- Analogon nicht: Gibtdata_frame(as.list(testVect)) einen 5-Zeilen- Datenrahmen zurück .
CoderGuy123
5
@Deleet tibble funktioniert mit as_tibble(as.list(testVect))oder as_data_frame(as.list(testVect))( as_data_frameist ein Alias ​​für as_tibble).
JWilliman
2
In Übereinstimmung mit den Kommentaren von @Deleet und @JWillliman, data.table(as.list(...))funktioniert nicht, sondern as.data.table(as.list(...))funktioniert.
Merv
@Matthew Plourde Ob stringsAsFactors True oder False, es gibt den gleichen Datentyp. Wie ändere ich den Datentyp nicht?
AMS
55

Die Antworten von @MatthewPlourde und @JackRyan funktionieren, aber wenn Sie einen lang benannten Vektor haben, ist es ärgerlich, einen Datenrahmen mit einer Zeile und vielen Spalten zu haben. Wenn Sie lieber eine "Schlüssel" -Spalte und eine "Wert" -Spalte mit vielen Zeilen haben möchten, sollte eine der folgenden Möglichkeiten funktionieren:

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
quelle
traurig, dass es keinen
Einzeiler
5
Kann auch verwenden tibble::enframe(testVect).
JWilliman
2
stack(testVect)tut dies auch, lässt aber die Werte als Zeichen.
Joe
@ Jelena-bioinf als Einzeiler mit dplyr-Syntax können Sie verwenden. testVect %>% as.list %>% as.data.frame %>% tidyr::gather()Dies erzeugt tatsächlich die Spalten 'key' und 'value', auf die sich @dnlbrky bezieht.
Agile Bean
stack(), was für eine unterschätzte Funktion!
Stevec
18

Ich werde das versuchen:

test.vector <- as.data.frame(t(testVect))
class(test.vector)
Jack Ryan
quelle
Oder noch kürzer, einfachdata.frame(t(testVect))
Tjebo
3

Ich benutzte die Funktionen in diesen Antworten vorgeschlagen zu verwenden ( as.list, as_tibble, t, enframeusw.) , aber seitdem , dass herausgefunden, dplyr::bind_rowsfunktioniert jetzt genau das zu tun , was die ursprüngliche Frage mit einem einzigen Funktionsaufruf fragt.

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

Erstellt am 10.11.2019 durch das reprex-Paket (v0.3.0)

Wie in tidyverse gezeigt - bevorzugte Methode, um einen benannten Vektor in einen data.frame / tibble umzuwandeln

Arthur Yip
quelle
0
named vector %>% as_tibble(.,rownames="column name of row.names")
BatmanFan
quelle
Bitte fügen Sie hier eine Erklärung hinzu, damit jeder lernen kann. Ab sofort ist ein Einzeiler etwas flach.
Mundharmonika141