tidyverse - 将命名向量转换为数据的首选方法。frame/tibble
tidyverse - prefered way to turn a named vector into a data.frame/tibble
经常使用 tidyverse
我经常面临将命名向量转换为 data.frame
/tibble
的挑战,其中列是向量的名称。
这样做的 prefered/tidyversey 方法是什么?
编辑:这与:this and 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
这对我有用:c("a" = 1, "b" = 2) %>% t() %>% tbl_df()
有趣的是,您可以使用列表的 as_tibble()
方法在一次调用中完成此操作。请注意,这不是最佳做法,因为这不是导出方法。
tibble:::as_tibble.list(vec)
现在使用 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()
and bind_cols()
now accept vectors. They are treated as rows by the former and columns by the latter. Rows require inner names like c(col1 = 1, col2 = 2)
, while columns require outer names: col1 = c(1, 2)
. Lists are still treated as data frames but can be spliced explicitly with !!!
, e.g. 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
惯用的方法是在 tibble()
调用中将向量与 !!!
拼接,这样命名的向量元素就成为列定义:
library(tibble)
vec <- c("a" = 1, "b" = 2)
tibble(!!!vec)
#> # A tibble: 1 x 2
#> a b
#> <dbl> <dbl>
#> 1 1 2
由 reprex package (v0.3.0)
于 2019-09-14 创建
经常使用 tidyverse
我经常面临将命名向量转换为 data.frame
/tibble
的挑战,其中列是向量的名称。
这样做的 prefered/tidyversey 方法是什么?
编辑:这与:this and 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
这对我有用:c("a" = 1, "b" = 2) %>% t() %>% tbl_df()
有趣的是,您可以使用列表的 as_tibble()
方法在一次调用中完成此操作。请注意,这不是最佳做法,因为这不是导出方法。
tibble:::as_tibble.list(vec)
现在使用 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()
andbind_cols()
now accept vectors. They are treated as rows by the former and columns by the latter. Rows require inner names likec(col1 = 1, col2 = 2)
, while columns require outer names:col1 = c(1, 2)
. Lists are still treated as data frames but can be spliced explicitly with!!!
, e.g.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
惯用的方法是在 tibble()
调用中将向量与 !!!
拼接,这样命名的向量元素就成为列定义:
library(tibble)
vec <- c("a" = 1, "b" = 2)
tibble(!!!vec)
#> # A tibble: 1 x 2
#> a b
#> <dbl> <dbl>
#> 1 1 2
由 reprex package (v0.3.0)
于 2019-09-14 创建