Почему в этом примере summaze_if не работает с bind_rows? - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь использовать bind_rows и summarize_if, чтобы добавить итоговую нижнюю строку в выборочный набор данных. Существуют различные сообщения, связанные с этим типом вопроса, но не совсем моя проблема. Кроме того, некоторые опубликованные вопросы содержат так много другого кода и данных, что я трачу больше времени, пытаясь выяснить код и пример, а не то, как ответ применяется в более общем плане.

Имея это в виду, у меня есть простой пример данных.

Воспроизводимый пример:

library(tidyverse)
library(readxl)

sample_pivot_data <- structure(list(Group = c("A", "B", "A", "A", "A", "B", "B", "B", 
                                "C", "C", "C"), Season = c("Winter", "Summer", "Winter", "Fall", 
                                                           "Spring", "Winter", "Fall", "Spring", "Winter", "Summer", "Summer"
                                ), Expense = c("Insurance", "Rent", "Utilities", "Misc", "Insurance", 
                                               "Rent", "Utilities", "Insurance", "Rent", "Utilities", "Misc"
                                ), Fixed_Variable = c("Fixed", "Fixed", "Variable", "Variable", 
                                                      "Fixed", "Fixed", "Variable", "Variable", "Fixed", "Variable", 
                                                      "Variable"), Amount = c(300, 200, 400, 300, 800, 400, 200, 300, 
                                                                              450, 230, 120)), row.names = c(NA, -11L), class = c("tbl_df", 
                                                                                                                                  "tbl", "data.frame"))


# A look at the data:

    > sample_pivot_data
# A tibble: 11 x 5
   Group Season Expense   Fixed_Variable Amount
   <chr> <chr>  <chr>     <chr>           <dbl>
 1 A     Winter Insurance Fixed             300
 2 B     Summer Rent      Fixed             200
 3 A     Winter Utilities Variable          400
 4 A     Fall   Misc      Variable          300
 5 A     Spring Insurance Fixed             800
 6 B     Winter Rent      Fixed             400
 7 B     Fall   Utilities Variable          200
 8 B     Spring Insurance Variable          300
 9 C     Winter Rent      Fixed             450
10 C     Summer Utilities Variable          230
11 C     Summer Misc      Variable          120

Я нашел похожую проблему, которая была рассмотрена в этом посте здесь , которая дала мне это решение, которое работает:

# This works, no syntax issues

my_pivot <- sample_pivot_data %>%
  group_by(Group, Fixed_Variable) %>%
  summarize(category_total = sum(Amount)) %>%
  pivot_wider(names_from = Fixed_Variable, values_from = category_total) %>%
  ungroup() %>%
  mutate(GrandTotal = rowSums(.[-1])) %>%
  bind_rows(summarize_all(.,                                                                 
                          funs(if (is.numeric(.))
                            sum(.)
                            else
                              "Grand_Total"))
            ) %>%
  print()


    # A tibble: 4 x 4
  Group      Fixed Variable GrandTotal
  <chr>      <dbl>    <dbl>      <dbl>
1 A           1100      700       1800
2 B            600      500       1100
3 C            450      350        800
4 Grand_Total 2150     1550       3700

Когда я пытался сделать то же самое, но использовать sumrize_if с кодом ниже, я получаю ошибку:
Ошибка в UseMethod ("tbl_vars") : нет применимого метода для 'tbl_vars', примененного к объекту класса "функция" Я смотрел здесь как возможное решение ошибки, но я не следил за тем, как это применяется в этом случае.

# This does not work

my_pivot2 <- sample_pivot_data %>%
  group_by(Group, Fixed_Variable) %>%
  summarize(category_total = sum(Amount)) %>%
  pivot_wider(names_from = Fixed_Variable, values_from = category_total) %>%
  ungroup() %>%
  mutate(GrandTotal = rowSums(.[-1])) %>%
  bind_rows(summarize_if(is.numeric, sum, na.rm = TRUE)) %>%
  print()

Если кто-то может объяснить, почему вышеперечисленное не работает, я был бы признателен. В связи с этим я также попробовал bind_rows(summarize_all(., list(~if(is.numeric(.)) sum(.) else "Grand_Total" ))), что сработало, но RStudio продолжал давать мне указание на то, что скобки не совпадают ... возможно, это другой вопрос, но я решил упомянуть, а не публиковать совершенно отдельный вопрос.

1 Ответ

0 голосов
/ 27 апреля 2020

Отсутствует . в summarize_if(). Это прекрасно работает:

my_pivot2 <- sample_pivot_data %>%
  group_by(Group, Fixed_Variable) %>%
  summarize(category_total = sum(Amount)) %>%
  pivot_wider(names_from = Fixed_Variable, values_from = category_total) %>%
  ungroup() %>%
  mutate(GrandTotal = rowSums(.[-1])) %>%
  bind_rows(summarize_if(., is.numeric, sum, na.rm = TRUE)) %>%
  print()

давая:

# A tibble: 4 x 4
  Group Fixed Variable GrandTotal
  <chr> <dbl>    <dbl>      <dbl>
1 A      1100      700       1800
2 B       600      500       1100
3 C       450      350        800
4 NA     2150     1550       3700
...