tidyverse-将命名向量转换为data.frame/tibble的首选方法
大量使用tidyverse-将命名向量转换为data.frame/tibble的首选方法,r,dplyr,tidyr,purrr,tidyverse,R,Dplyr,Tidyr,Purrr,Tidyverse,大量使用tidyverse时,我经常面临将命名向量转换为数据帧/tibble的挑战,其中列是向量的名称。 做这件事的首选方法是什么? 编辑:这与:和github问题有关 所以我想: require(tidyverse) vec <- c("a" = 1, "b" = 2) 用例示例: require(tidyverse) require(rvest) txt <- c('<node a="1" b="2"></node>', '<no
tidyverse
时,我经常面临将命名向量转换为数据帧
/tibble
的挑战,其中列是向量的名称。做这件事的首选方法是什么?
编辑:这与:和github问题有关 所以我想:
require(tidyverse)
vec <- c("a" = 1, "b" = 2)
用例示例:
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)
require(tidyverse)
要求(rvest)
txt%map(读取xml)%%>%map(xml属性)%%>%map df(~t(%)%%>%as_-tible)
给
# A tibble: 2 × 3
a b c
<chr> <chr> <chr>
1 1 2 <NA>
2 1 <NA> 3
#一个tible:2×3
a、b、c
1 1 2
2 1 3
这对我很有用:c(“a”=1,b”=2)%%>%t()%%>%tbl_df()
有趣的是,您可以对列表使用as_tible()
方法在一次调用中完成此操作。请注意,这不是最佳做法,因为这不是导出的方法
tibble:::as_tibble.list(vec)
现在可以使用
bind_rows
(在dplyr 0.7.0
中介绍)直接支持这一点:
library(tidyverse))
vec#A tibble:1 x 2
#>a b
#>
#> 1 1 2
这段引语解释了这一变化:
bind_rows()
和bind_cols()
现在接受向量。前者将它们视为行,后者视为列。行需要内部名称,如c(col1=1,col2=2)
,而列需要外部名称:col1=c(1,2)
。列表仍被视为数据帧,但可以使用显式拼接代码>,例如,绑定行(!!!x)
(#1676)
通过此更改,它意味着用例示例中的以下行:
txt%%>%map(读取xml)%%>%map(xml属性)%%>%map\df(~t(%)%%>%as\u tible)
可以重写为
txt%%>%map(读取xml)%%>%map(xml属性)%%>%map(绑定行)
这也相当于
txt%%>%map(读取xml)%%>%map(xml属性)%%>%{bind\u rows(!!!)}
下面的示例演示了不同方法的等效性:
库(tidyverse)
图书馆(rvest)
txt%映射(xml\u属性)
#x、y和z是相同的
x%映射密度(~t(%)%%>%为可存储)
y%map\u df(绑定行)
z[1]正确
相同(y,z)
#>[1]是的
Z
#>#tibble:2 x 3
#>a、b、c
#>
#> 1 1 2
#> 2 1 3
惯用的方法是用拼接向量在tibble()
调用中的code>使命名向量元素成为列定义:
库(TIBLE)
vec#A tibble:1 x 2
#>a b
#>
#> 1 1 2
由(v0.3.0)于2019-09-14创建的(如果有的话,您认为您所做的工作有什么不足(?)我问自己同样的问题,因为bind_rows
不起作用,而map_df(~t(%)%%>%as_tible)
。因此,直到现在,我转置、转换到字符串保留字符(而不是因子)的数据帧,然后将结果绑定在一起。不过,为这项常见任务提供一个快捷方式可能很好。@lukeA,我认为bind_rows
已经更新,现在可以按照您希望的方式工作了。我对设置内部名称和引用外部名称之间的区别感到有点困惑。请看我的问题:
# A tibble: 2 × 3
a b c
<chr> <chr> <chr>
1 1 2 <NA>
2 1 <NA> 3
tibble:::as_tibble.list(vec)