将命名字符向量转换为 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_frame
是as_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.list
、as_tibble
、t
、enframe
等),但后来发现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