名前付き文字ベクトルをdata.frameに変換します


87

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

回答:


86

と同じくらい簡単data.frame(as.list(testVect))です。または、列に適切なデータ型が必要な場合は、data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE)


1
奇妙なことに、これのティブルアナログは機能しませんdata_frame(as.list(testVect))。5行のデータフレームを返します。
coderGuy1 2318年

5
@Deleet tibbleas_tibble(as.list(testVect))or as_data_frame(as.list(testVect))as_data_frameのエイリアスas_tibble)で動作します。
JWilliman 2018

2
@Deleetと@JWilllimanのコメントに沿って、data.table(as.list(...))機能しませんが、代わりにas.data.table(as.list(...))機能します。
merv 2018

@Matthew Plourde stringAsFactorsがTrueかFalseかに関係なく、同じデータ型を提供します。データ型を変更しない方法は?
AMS

57

@MatthewPlourdeと@JackRyanからの回答は機能しますが、名前の付いた長いベクトルがある場合、1行と多くの列を持つデータフレームがあるのは面倒です。多くの行を持つ「キー」列と「値」列が必要な場合は、次のいずれかが機能するはずです。

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

5
も使用できますtibble::enframe(testVect)
JWilliman 2018

2
stack(testVect)これも行いますが、値は文字のままにします。
ジョー

@ Jelena-bioinfをdplyr構文のワンライナーとして使用できます。testVect %>% as.list %>% as.data.frame %>% tidyr::gather()これにより、@ dnlbrkyが参照する「key」列と「value」列が実際に生成されます。
アジャイルビーン

stack()、なんて過小評価されている機能でしょう。
stevec

18

私はこれを突き刺すつもりです:

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

あるいは短く、単純にdata.frame(t(testVect))
tjebo

3

私はこれらの答えで提案機能を使用するために使用される(as.listas_tibbletenframe、など)が、以来、ことを見出したdplyr::bind_rows今、元の質問は、1つの関数呼び出しを要求します正確に何をやって動作します。

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に示されているように-名前付きベクトルをdata.frame / tibbleに変換するための好ましい方法


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

みんなが学べるように、このあたりに説明を加えてください。今のところ、ワンライナーは少し浅いです。
harmonica141
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.