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

Tyl*_*uth 74 r vector type-conversion dataframe

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

testVect <- structure(c("11.2.0.3.0", "12.89", "12.71"), .Names = c("db_version", 
             "elapsed_time", "cpu_time"))
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

Mat*_*rde 68

这很简单data.frame(as.list(testVect)).或者,如果您想为列提供合理的数据类型,data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE).

  • @Deleet**tibble**将使用`as_tibble(as.list(testVect))`或`as_data_frame(as.list(testVect))````as_data_frame`是`as_tibble`的别名. (4认同)
  • 奇怪的是,**tibble** 类似的方法不起作用:`data_frame(as.list(testVect))` 返回一个 5 行数据帧。 (2认同)
  • 与@Deleet和@JWillliman的评论一致,`data.table(as.list(...))`不起作用,而`as.data.table(as.list(...))`起作用。 (2认同)

dnl*_*rky 49

来自@MatthewPlourde和@JackRyan的答案可以解决,但是如果你有一个很长的命名向量,那么拥有一行和多列的数据框会很烦人.如果您想要一个包含许多行的"key"列和"value"列,则以下任何一项都应该有效:

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
Run Code Online (Sandbox Code Playgroud)

  • 也可以使用`tibble :: enframe(testVect)`. (4认同)
  • `stack(testVect)` 也这样做,但将值保留为字符。 (2认同)
  • `stack()`,多么被低估的函数啊! (2认同)

Jac*_*yan 16

我要去试一下:

test.vector <- as.data.frame(t(testVect))
class(test.vector)
Run Code Online (Sandbox Code Playgroud)


Art*_*Yip 9

我曾经使用这些答案中建议的函数(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
Run Code Online (Sandbox Code Playgroud)

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

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