Converti vettore carattere con nome in data.frame


87

Ho un vettore di caratteri con nome restituito da xmlAttrs come questo:

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

Vorrei convertirlo in un data frame simile a questo:

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

Risposte:


86

È semplice come data.frame(as.list(testVect)). Oppure, se volete i tipi di dati sensibili per le colonne, data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE).


1
Stranamente, l' analogo della tabella di questo non funziona: data_frame(as.list(testVect))restituisce un frame di dati di 5 righe.
CoderGuy123

5
@Deleet tibble funzionerà con as_tibble(as.list(testVect))o as_data_frame(as.list(testVect))( as_data_frameè un alias per as_tibble).
JWilliman

2
In linea con i commenti di @Deleet e @JWillliman, data.table(as.list(...))non funziona, ma invece as.data.table(as.list(...))funziona.
merv

@Matthew Plourde Sia che stringsAsFactors sia True o False, fornisce lo stesso tipo di dati. Come non modificare il tipo di dati?
AMS

57

Le risposte di @MatthewPlourde e @JackRyan funzionano, ma se hai un vettore con nome lungo è fastidioso avere un data frame con una riga e molte colonne. Se preferisci avere una colonna "chiave" e una colonna "valore" con molte righe, dovrebbe funzionare una delle seguenti opzioni:

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

triste che non ci sia una battuta
JelenaČuklina

5
Può anche usare tibble::enframe(testVect).
JWilliman

2
stack(testVect)fa anche questo ma lascia i valori come caratteri.
Joe

@ Jelena-bioinf come one-liner con sintassi dplyr, puoi usare testVect %>% as.list %>% as.data.frame %>% tidyr::gather()Questo produce effettivamente le colonne "chiave" e "valore" a cui si riferiva @dnlbrky.
Agile Bean

stack(), che funzione sottovalutata!
stevec

18

Proverò a provare questo:

test.vector <- as.data.frame(t(testVect))
class(test.vector)

O anche più breve, semplicementedata.frame(t(testVect))
tjebo

3

Ho usato per usare le funzioni suggerite in queste risposte ( as.list, as_tibble, t, enframe, etc.) ma da allora scoperto che dplyr::bind_rowsora lavora per fare esattamente ciò che la domanda iniziale chiede con una sola chiamata di funzione.

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

Creato il 10/11/2019 dal pacchetto reprex (v0.3.0)

Come mostrato in tidyverse, il modo preferito per trasformare un vettore con nome in un data.frame / tibble


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

Per favore aggiungi qualche spiegazione qui intorno così tutti possono imparare. A partire da ora un one-liner è un po 'superficiale.
harmonica141
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.