2016-10-14 5 views
5

tidyverseを頻繁に使用すると、名前付きベクトルをdata.frame/に変換するという課題に直面することがよくあります。
これを行う方法として、どのような方法がありますか?
EDIT:これに関連している:thisthis githubの発行名前付きベクトルをdata.frame/tibbleに変換する方法が好ましい

だから私がしたい:

require(tidyverse) 
vec <- c("a" = 1, "b" = 2) 

は、このになるために:

# A tibble: 1 × 2 
     a  b 
    <dbl> <dbl> 
1  1  2 

私は経由例えばこれを行うことができます:

vec %>% enframe %>% spread(name, value) 
vec %>% t %>% as_tibble 

ユースケース例:

require(tidyverse) 
require(rvest) 
txt <- c('<node a="1" b="2"></node>', 
     '<node a="1" c="3"></node>') 

txt %>% map(read_xml) %>% map(xml_attrs) %>% map_df(~t(.) %>% as_tibble) 

# A tibble: 2 × 3 
     a  b  c 
    <chr> <chr> <chr> 
1  1  2 <NA> 
2  1 <NA>  3 
+0

まさに、どちらかといえば、あなたは何をしているかについては欠けていると思います – shayaa

+2

私は自分自身を尋ねました(?)これは 'map_df(〜t(。)%>%as_tibble)'の代わりに 'bind_rows'が動作しないためです。だから今までは、文字列(要素ではない)を保持したデータフレームに変換して変換し、結果を結合します。しかし、この共通のタスクのためのショートカットはいいかもしれません。 – lukeA

+1

@lukeA、私は 'bind_rows'が今あなたが望むように動作するように更新されていると思います – markdly

答えて

2

これは今、直接(dplyr 0.7.0で導入)bind_rowsを使用してサポートされていますhttps://cran.r-project.org/web/packages/dplyr/news.htmlから

library(tidyverse)) 
vec <- c("a" = 1, "b" = 2) 

bind_rows(vec) 
#> # A tibble: 1 x 2 
#>  a  b 
#> <dbl> <dbl> 
#> 1  1  2 

この引用は、変更について説明します。

bind_rows()bind_cols()今のベクトルを受け入れます。それらは前者の行と後者の列として扱われます。行にはc(col1 = 1, col2 = 2)のような内部名が必要ですが、列には外部名が必要です。col1 = c(1, 2)。リストは依然としてデータフレームとして扱われるが、!!!で明示的にスプライスすることができる。 bind_rows(!!! x)(#1676)。

txt %>% map(read_xml) %>% map(xml_attrs) %>% map_df(~t(.) %>% as_tibble)

に相当する

txt %>% map(read_xml) %>% map(xml_attrs) %>% map_df(bind_rows)

のように書き換えることができる:この変更により

、それはユースケースの例の次の行があることを意味します

txt %>% map(read_xml) %>% map(xml_attrs) %>% { bind_rows(!!! .) }

異なるアプローチの等価性は、次の例に示されている:

library(tidyverse) 
library(rvest) 

txt <- c('<node a="1" b="2"></node>', 
     '<node a="1" c="3"></node>') 

temp <- txt %>% map(read_xml) %>% map(xml_attrs) 

# x, y, and z are identical 
x <- temp %>% map_df(~t(.) %>% as_tibble) 
y <- temp %>% map_df(bind_rows) 
z <- bind_rows(!!! temp) 

identical(x, y) 
#> [1] TRUE 
identical(y, z) 
#> [1] TRUE 

z 
#> # A tibble: 2 x 3 
#>  a  b  c 
#> <chr> <chr> <chr> 
#> 1  1  2 <NA> 
#> 2  1 <NA>  3 
0

を与えるこれが私の作品:リストが1回の呼び出しでこれを実行するため

0

c("a" = 1, "b" = 2) %>% t() %>% tbl_df()は、興味深いことに、あなたがas_tibble()メソッドを使用することができます。これはエクスポートされたメソッドではないため、これはベストプラクティスではありません。

tibble:::as_tibble.list(vec) 
関連する問題