Я пытаюсь использовать 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 продолжал давать мне указание на то, что скобки не совпадают ... возможно, это другой вопрос, но я решил упомянуть, а не публиковать совершенно отдельный вопрос.