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

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


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

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)

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


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

Bitte fügen Sie hier eine Erklärung hinzu, damit jeder lernen kann. Ab sofort ist ein Einzeiler etwas flach.
Mundharmonika141
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.