代码之家  ›  专栏  ›  技术社区  ›  rdelrossi

将函数应用于数据帧价值观

  •  1
  • rdelrossi  · 技术社区  · 4 年前

    d <- tibble(a = c(45, 1, 2, 9), b = c(3, 19, 8, 12))
    
    > d
    # A tibble: 4 x 2
          a     b
      <dbl> <dbl>
    1    45     3
    2     1    19
    3     2     8
    4     9    12
    

    我想用调用toOrdinal(从toOrdinal库)的结果来改变一些新变量。我试过了:

    d %>% mutate(
      across(everything(), ~ toOrdinal::toOrdinal(.x), .names = "ord_{col}")
    )
    

    但结果并不正确:

    # A tibble: 4 x 4
          a     b ord_a ord_b
      <dbl> <dbl> <chr> <chr>
    1    45     3 45th  3rd  
    2     1    19 1th   19rd 
    3     2     8 2th   8rd  
    4     9    12 9th   12rd 
    

    相反,我想看到的是:

    # A tibble: 4 x 4
          a     b ord_a ord_b
      <dbl> <dbl> <chr> <chr>
    1    45     3 45th  3rd  
    2     1    19 1st   19th 
    3     2     8 2nd   8th  
    4     9    12 9th   12th 
    

    这个 warnings()

    欢迎任何指导!

    1 回复  |  直到 4 年前
        1
  •  2
  •   akrun    4 年前

    函数不是 Vectorized . 要么我们用 rowwise Vectorize 功能

    library(dplyr)
    library(toOrdinal)
    d %>% 
        mutate(across(everything(), ~  Vectorize(toOrdinal)(.),.names = "ord_{col}"))
    

    # A tibble: 4 x 4
    #      a     b ord_a ord_b
    #  <dbl> <dbl> <chr> <chr>
    #1    45     3 45th  3rd  
    #2     1    19 1st   19th 
    #3     2     8 2nd   8th  
    #4     9    12 9th   12th 
    

    划船

    d %>%
       rowwise() %>%
       mutate(across(everything(), ~ toOrdinal(.), .names = "ord_{col}")) %>%
       ungroup
    

    -输出

    #一张桌子:4 x 4
    #<dbl><dbl><chr><chr>
    #1 45 3 45第3
    #2119第1 19页
    #4 9 12 9第12
    

    或者另一个选择是用 pmap purrr

    library(purrr)
    library(stringr)
    pmap_dfr(d, ~  map_dfr(list(...), toOrdinal)) %>% 
       rename_all(~ str_c('ord_', .)) %>%
       bind_cols(d, .)
    

    -输出

    #<dbl><dbl><chr><chr>
    #1 45 3 45第3
    #2119第1 19页
    #4 9 12 9第12