将命名字符向量转换为data.frame


86

我有一个从xmlAttrs返回的命名字符向量,如下所示:

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

我想将其转换为如下所示的数据框:

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

Answers:


84

就像一样简单data.frame(as.list(testVect))。或者,如果您希望为列提供明智的数据类型,请使用data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE)


1
奇怪的是,这种微不足道的模拟无法正常工作:data_frame(as.list(testVect))返回5行数据帧。
CoderGuy123 '18

5
@Deleet tibble与将工作as_tibble(as.list(testVect))as_data_frame(as.list(testVect))as_data_frame是一个别名as_tibble)。
JWilliman '18 -4-2

2
与@Deleet和@JWillliman的评论一致,data.table(as.list(...))它不起作用,但是起作用了as.data.table(as.list(...))
merv

@Matthew Plourde无论stringsAsFactors是True还是False,它都提供相同的数据类型。如何不更改数据类型?
AMS

56

@MatthewPlourde和@JackRyan的答案起作用,但是如果您有一个长命名向量,那么拥有一个包含一行和许多列的数据帧会很烦人。如果您希望有一个包含许多行的“键”列和一个“值”列,那么以下任何一种方法都可以工作:

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

可悲的是有没有一个班轮
JelenaČuklina

5
也可以使用tibble::enframe(testVect)
JWilliman '18 -4-2

2
stack(testVect)也这样做,但是将值保留为字符。

@ Jelena-bioinf是使用dplyr语法的单行代码,您可以使用testVect %>% as.list %>% as.data.frame %>% tidyr::gather()它实际上会生成@dnlbrky所指的“键”和“值”列。
敏捷豆

stack(),多么低估的功能!
stevec


3

我曾经使用(在这些答案提出的功能as.listas_tibbletenframe,等),但此后发现,dplyr::bind_rows现在的作品做原来的问题问了一个函数调用什么。

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

reprex软件包(v0.3.0)创建于2019-11-10

tidyverse所示-将命名矢量转换为data.frame / tibble的首选方法


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

请在此处添加一些说明,以便每个人都可以学习。截至目前,单线纸有点浅。
口琴
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.