代码之家  ›  专栏  ›  技术社区  ›  Ujjawal Bhandari

sym参数类型无效

  •  1
  • Ujjawal Bhandari  · 技术社区  · 4 年前

    在计算完计数和比例后,我尝试添加总行。我已经为同一个函数创建了一个函数,但是它在传递时返回错误 !!sym(group_var)

    freq_table <- function(df, group_var) {
          
          group_var2 <- !!sym(group_var)
          
          df %>%
            group_by_at(group_var) %>%
            summarise(n = n()) %>%
            mutate(freq = n / sum(n)) %>%
            ungroup %>%
            bind_rows(., data.frame(
              group_var2 := "Grand Total",
              sapply(. %>% dplyr::select_if(is.numeric),
                     function(x) sum(x, na.rm = T)) %>% t()
            ))
          
        }
        
        freq_table(iris, group_var = "Species")
    
    1 回复  |  直到 4 年前
        1
  •  2
  •   akrun    4 年前

    我们可以更容易地做到这一点 adorn_totals

    freq_table <- function(df, group_var) {
      df %>%
         dplyr::group_by(across(all_of(group_var))) %>%
         dplyr::summarise(n = n(), .groups = 'drop') %>%
         dplyr::mutate(freq = n / sum(n)) %>%
         janitor::adorn_totals(name = "Grand Total")     
      
    }
    

    -测试

    freq_table(iris, group_var = "Species")
    #     Species   n      freq
    #      setosa  50 0.3333333
    #  versicolor  50 0.3333333
    #   virginica  50 0.3333333
    # Grand Total 150 1.0000000
    

    !! 应该在tidyverse函数中使用。而且,这里我们不需要 sym !! 操作人员正在使用 group_by_at := ),左侧可以是字符串。修改了 bind_rows 循环经过 sapply t 当它返回 matrix . 我们可以利用 summarise across 环游世界 numeric 列,并在底部添加新行 add_row

    freq_table <- function(df, group_var) {     
      
        df %>%
           group_by_at(all_of(group_var)) %>%
           summarise(n = n()) %>%
           mutate(freq = n / sum(n)) %>%
           ungroup %>%
           add_row(
          !!group_var := "Grand Total",
                      {.} %>% 
                summarise(across(where(is.numeric), sum, na.rm = TRUE)))          
      
      }
    

    freq_table(iris, group_var = "Species")
    # A tibble: 4 x 3
    #  Species         n  freq
    #  <chr>       <int> <dbl>
    #1 setosa         50 0.333
    #2 versicolor     50 0.333
    #3 virginica      50 0.333
    #4 Grand Total   150 1