Converter vetor de caracteres nomeados em data.frame

86

Eu tenho um vetor de caractere nomeado retornado de xmlAttrs como este:

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

Eu gostaria de convertê-lo em um quadro de dados parecido com este:

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
fonte

Respostas:

84

É tão simples quanto data.frame(as.list(testVect)). Ou se você quiser tipos de dados sensíveis para suas colunas data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE),.

Matthew Plourde
fonte
1
Curiosamente, o análogo de tabela disso não funciona: data_frame(as.list(testVect))retornar um quadro de dados de 5 linhas.
CoderGuy123
5
@Deleet tibble funcionará com as_tibble(as.list(testVect))ou as_data_frame(as.list(testVect))( as_data_frameé um apelido para as_tibble).
JWilliman
2
Em linha com os comentários de @Deleet e @JWillliman, data.table(as.list(...))não funciona, mas sim as.data.table(as.list(...)).
merv
@Matthew Plourde Se stringsAsFactors True ou False, fornece o mesmo tipo de dados. Como não mudar o tipo de dado?
AMS
56

As respostas de @MatthewPlourde e @JackRyan funcionam, mas se você tiver um vetor com nome longo, é irritante ter um quadro de dados com uma linha e muitas colunas. Se você preferir uma coluna "chave" e uma coluna "valor" com muitas linhas, qualquer uma das seguintes opções deve funcionar:

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
fonte
triste por não haver uma linha
única
5
Também pode usar tibble::enframe(testVect).
JWilliman
2
stack(testVect)também faz isso, mas deixa os valores como caracteres.
Joe
@ Jelena-bioinf como uma linha com sintaxe dplyr, você pode usar testVect %>% as.list %>% as.data.frame %>% tidyr::gather()Isso realmente produz as colunas 'chave' e 'valor' às quais @dnlbrky se referiu.
Agile Bean
stack(), que função subestimada!
stevec
18

Vou tentar isso:

test.vector <- as.data.frame(t(testVect))
class(test.vector)
Jack ryan
fonte
Ou ainda mais curto, simplesmentedata.frame(t(testVect))
Tjebo
3

Eu costumava usar as funções sugeridas nessas respostas ( as.list, as_tibble, t, enframe, etc.), mas desde então descobri que dplyr::bind_rowsagora trabalha para fazer exatamente o que a pergunta original pergunta com uma única chamada de função.

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

Criado em 10/11/2019 pelo pacote reprex (v0.3.0)

Conforme mostrado no tidyverse - forma preferida de transformar um vetor nomeado em um data.frame / tibble

Arthur Yip
fonte
0
named vector %>% as_tibble(.,rownames="column name of row.names")
BatmanFan
fonte
Adicione alguma explicação aqui para que todos possam aprender. A partir de agora, um one-liner é um pouco superficial.
harmonica141