【问题标题】:Convert Named Character Vector to data.frame将命名字符向量转换为 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

【问题讨论】:

    标签: r dataframe vector type-conversion


    【解决方案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 正是这个意思,但我来到这里寻找另一个但类似的问题,并花了很长时间试图弄清楚为什么这种方法会产生奇怪的结果......
      猜你喜欢
      • 2017-02-23
      • 2021-02-22
      • 2011-10-27
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多