基于目标类型规范的斜排的整洁铸造

时间:2019-01-11 16:59:36

标签: r casting type-conversion coercion vctrs

是否有建议的“整型类型转换”方法,即根据目标规范将tibble的列强制为所需的类型/类?

由于vctrs似乎为向量提出了新的整洁的“螺母和粗体”,所以我可能更喜欢基于vctrs的解决方案。虽然我有一些可行的方法,但我想知道是否有比“混合类型转换”更好的方法(如果这是正确的概念术语),而不是混合使用以下方法:

  1. 以R为基础的事物,例如factor()numeric()
  2. vctrs::vec_cast()的方法
  3. 并通过purrr::map2_df()
  4. 处理地图零件

这是到目前为止我能想到的:

library(magrittr)
#> Warning: package 'magrittr' was built under R version 3.5.2

# Data ----
df <- tibble::tribble(
  ~col_a, ~col_b,
  "a",   "1",
  "b",   "2",
  "c",   "3"
)

# Approach via readr::cols and readr::type_convert -----
col_types <- readr::cols(
  readr::col_factor(),
  readr::col_double()
)

df %>% 
  readr::type_convert(col_types = col_types)
#> # A tibble: 3 x 2
#>   col_a col_b
#>   <chr> <dbl>
#> 1 a         1
#> 2 b         2
#> 3 c         3

# Approach via vctrs::vec_cast -----
col_types <- list(
  factor(),
  numeric()
)

df %>%
  purrr::map2_df(col_types, function(.x, to) {
    vctrs::vec_cast(.x, to)
  }) 
#> # A tibble: 3 x 2
#>   col_a col_b
#>   <fct> <dbl>
#> 1 a         1
#> 2 b         2
#> 3 c         3

reprex package(v0.2.1)于2019-01-11创建

让我惊讶的是,通过readr::type_convert()进行的处理似乎忽略了col_a应该成为factor的事实。

1 个答案:

答案 0 :(得分:1)

cols()函数需要命名参数。所以

col_types <- readr::cols(
  col_a = readr::col_factor(),
  col_b = readr::col_double()
)

将与

一起使用
df %>% 
  readr::type_convert(col_types = col_types)