将命名字符向量转换为数据框

112

我从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
6个回答

100

只需要使用代码 data.frame(as.list(testVect)) 即可。或者如果您希望为列设置合理的数据类型,则可以使用代码 data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE)


2
奇怪的是,这个 tibble 的类比并不起作用:data_frame(as.list(testVect)) 返回一个 5 行数据框。 - CoderGuy123
7
@Deleet tibble 可以使用 as_tibble(as.list(testVect))as_data_frame(as.list(testVect))as_data_frameas_tibble 的别名)来处理。 - JWilliman
2
根据@Deleet和@JWillliman的评论,data.table(as.list(...))无法正常工作,而应该使用as.data.table(as.list(...)) - merv
@Matthew Plourde 无论 stringsAsFactors 是 True 还是 False,它都会给出相同的数据类型。如何不改变数据类型? - AMS

76

@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
8
可以使用tibble::enframe(testVect) - JWilliman
4
stack(testVect) 也可以做到这一点,但是它会将值保留为字符。 - Joe
2
stack(),多么被低估的函数! - stevec
栈是很棒的,但当你的向量不是向量时它会失败... ;) https://dev59.com/t7z4oIgBc1ULPQZFsWSy#72398318 - tjebo
显示剩余2条评论

22
我来试着解释一下这个问题:

我将尝试解决这个问题:

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

1
甚至更简单的,只需使用 data.frame(t(testVect)) - tjebo

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

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

tidyverse - 将命名向量转换为数据框/表格的首选方法所示


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

请在这里添加一些解释,以便每个人都可以学习。目前为止,一行代码有点浅显了。 - harmonica141

2
这是一个使用 tibble 的例子: named_vector_df = tibble(name = names(named_vector), value = named_vector)

1
对于像我这样的新手,请注意:这将创建一个具有2列的df,其中一个命名为“name”(数据为名称,而不是行名称),另一个命名为“value”。我理解OP的意思是这个,但我来到这里搜索另一个但类似的问题,并花了很长时间试图弄清楚为什么这种方法会产生奇怪的结果... - Esmu Igors

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接