Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于目标类型规范的tible柱整齐型铸造_R_Casting_Type Conversion_Coercion_Vctrs - Fatal编程技术网

R 基于目标类型规范的tible柱整齐型铸造

R 基于目标类型规范的tible柱整齐型铸造,r,casting,type-conversion,coercion,vctrs,R,Casting,Type Conversion,Coercion,Vctrs,是否有推荐的“整齐类型转换”方法,即根据目标规范将tible的列强制为所需的类型/类 由于似乎为向量提出了新的整洁的“螺母和粗体”,我可能更喜欢基于vctrs的解决方案。虽然我有一些有效的方法,但我想知道是否有比混合使用以下方法更好的“整洁类型铸造”(如果这是正确的概念术语): 基本R值,如factor()和numeric() vctrs::vec_cast()的方法 并通过purrr::map2_df() 这就是我目前能想到的: library(magrittr) #> Warning:

是否有推荐的“整齐类型转换”方法,即根据目标规范将
tible
的列强制为所需的类型/类

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

  • 基本R值,如
    factor()
    numeric()
  • vctrs::vec_cast()的方法
  • 并通过
    purrr::map2_df()
  • 这就是我目前能想到的:

    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
    
    库(magrittr)
    #>警告:包“magrittr”是在R版本3.5.2下构建的
    #资料----
    df#A tible:3 x 2
    #>a列b列
    #>    
    #>1 a 1
    #>2 b 2
    #>3 c 3
    #通过vctrs::vec_cast进近-----
    col_类型%
    purrr::map2_df(列类型,函数(.x,to){
    vctrs::矢量转换(.x,到)
    }) 
    #>#tibble:3 x 2
    #>a列b列
    #>    
    #>1 a 1
    #>2 b 2
    #>3 c 3
    
    由(v0.2.1)于2019-01-11创建

    令我惊讶的是,通过
    readr::type_convert()
    的方法似乎忽略了这样一个事实:
    col\u a
    应该成为
    因子
    cols()
    函数需要命名参数。所以

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

    谢谢你指出这一点。虽然有点奇怪,它对double有效,但对factor无效,不是吗?如果不传递任何参数,它无论如何都会将其转换为double(请参见
    df%>%readr::type_convert()
    ),因此它基本上忽略了传入的内容。默认值是
    col\u guess()
    ,因此猜测是因为您的所有字符值都是数字,所以您需要一个数字列。
    df %>% 
      readr::type_convert(col_types = col_types)