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

Posted

技术标签:

【中文标题】将命名字符向量转换为 data.frame【英文标题】:Convert Named Character Vector to data.frame 【发布时间】:2013-05-24 20:09:31 【问题描述】:

我有一个从 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

【问题讨论】:

【参考方案1】:

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

【讨论】:

奇怪的是,类似的 tibble 不起作用:data_frame(as.list(testVect)) 返回一个 5 行数据框。 @Deleet tibble 将与as_tibble(as.list(testVect))as_data_frame(as.list(testVect)) 一起使用(as_data_frameas_tibble 的别名)。 与@Deleet 和@JWillliman 的cmets 一致,data.table(as.list(...)) 不起作用,但as.data.table(as.list(...)) 起作用。 @Matthew Plourde 无论 stringsAsFactors True 还是 False,它都给出相同的数据类型。如何不改变数据类型?【参考方案2】:

我要试一试:

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

【讨论】:

或者更短,简单的data.frame(t(testVect))【参考方案3】:

@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

【讨论】:

很遗憾没有单线 也可以使用tibble::enframe(testVect) stack(testVect) 也这样做,但将值保留为字符。 stack(),多么被低估的功能!【参考方案4】:

我曾经使用这些答案中建议的功能(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 package (v0.3.0) 于 2019 年 11 月 10 日创建

如tidyverse - prefered way to turn a named vector into a data.frame/tibble所示

【讨论】:

【参考方案5】:
named vector %>% as_tibble(.,rownames="column name of row.names")

【讨论】:

请在此处添加一些解释,以便大家学习。到目前为止,单线有点浅。【参考方案6】:

这是一个使用tibble的例子:

named_vector_df = tibble(name = names(named_vector), value = named_vector)

【讨论】:

像我这样的新手请注意:这会创建一个包含 2 列的 df,一列名为“name”(名称为数据,而不是 row.names),另一列名为“value”。我明白 OP 正是这个意思,但我来到这里寻找另一个但类似的问题,并花了很长时间试图弄清楚为什么这种方法会产生奇怪的结果......

以上是关于将命名字符向量转换为 data.frame的主要内容,如果未能解决你的问题,请参考以下文章

将 data.frame 列转换为向量?

将作为列表的 data.frame 转换为完整但字符的 data.frame

将R data.frame中的几列从整数转换为数字

r怎么把data.frame的因子向量转化为字符

根据存储在 data.frame 中的单独字符向量,有条件地重命名列表中的列

R语言数据转换(一)2021.2.25