gpt4 book ai didi

r - tidyverse-将命名矢量转换为data.frame/tibble的首选方法

转载 作者:行者123 更新时间:2023-12-03 21:28:50 24 4
gpt4 key购买 nike

经常使用tidyverse时,我经常面临将命名向量转换为data.frame / tibble的挑战,其中列是向量的名称。
这样做的首选/方法是什么?
编辑:这与:thisthis 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

最佳答案

现在使用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

关于r - tidyverse-将命名矢量转换为data.frame/tibble的首选方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40036207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com