如何以编程方式设置小标题列类型 数据

问题描述

使用以下方法读取高大的XLSX文件我有些不高兴:

> file = readxl::read_xlsx(filename,"sheetname")

避免实际XLSX文件的玩具示例:

> file = tibble(
+     names = c("name1","name2","name3"),+     values = c(TRUE,1,"chr")
+ )
> file
# A tibble: 3 x 2
  names values
  <chr> <chr> 
1 name1 TRUE  
2 name2 1     
3 name3 chr   

我想将其转换为此:

# A tibble: 1 x 3
  name1 name2 name3
  <dbl> <lgl> <chr>
1     1 TRUE  chr 

但是由于pivot_wider()确定values列的类型为<chr>,因此pivot_wider()会为所有加宽的列保留该类型。

> file %>% pivot_wider(names_from = names,values_from = values)
# A tibble: 1 x 3
  name1 name2 name3
  <chr> <chr> <chr>
1 TRUE  1     chr  

这需要我再次手动设置每种列类型。还有另一种(自动)方式吗?该文件的格式是固定的,但是内容可能会更改,因此我不能依赖硬编码类型设置。对于我来说,理想的做法是

readxl::read_xlsx(filename,"sheetname") %>%
  pivot_wider(names_from = column1,values_from = column2,col_types = NULL)

解决方法

如果我们用type.convert换行,它将自动更改类型

library(dplyr)
library(tidyr)
file %>% 
  pivot_wider(names_from = names,values_from = values) %>% 
  type.convert(as.is = TRUE)
# A tibble: 1 x 3
#  name1 name2 name3
#  <lgl> <int> <chr>
#1 TRUE      1 chr  

或使用deframe/as_tibble_row,转换为tibble

library(tibble)
deframe(file) %>% 
   as_tibble_row %>% 
   type.convert(as.is = TRUE)

另一个选项是data.table::transpose

type.convert(data.table::transpose(file,make.names = 'names'),as.is = TRUE)
#  name1 name2 name3
#1  TRUE     1   chr

数据

file <- structure(list(names = c("name1","name2","name3"),values = c("TRUE","1","chr")),row.names = c(NA,-3L),class = c("tbl_df","tbl","data.frame"))