23

tidyversea lotを使用して、名前付きベクトルをdata.frame/に変換しtibble、列をベクトルの名前にするという課題に直面することがよくあります。
これを行うための好ましい/きちんとした方法は何ですか?
編集: これは関連しています: thisおよびthis github-issue

だから私は欲しい:

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
4

4 に答える 4

27

これは、bind_rows( で導入dplyr 0.7.0) を使用して直接サポートされるようになりました。

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

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

https://cran.r-project.org/web/packages/dplyr/news.htmlからのこの引用は、変更について説明しています。

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
于 2017-09-18T20:38:56.753 に答える
1

これは私のために働く:c("a" = 1, "b" = 2) %>% t() %>% tbl_df()

于 2017-09-18T19:15:05.760 に答える