Здесь решение, возможно, не самое лучшее, но оно работает ...
## Load Data
customer_id <- c(12,12,34,234,781,456)
Sales_id <- c(20013211129,
20013217122,
20013149844,
20013273151,
20013222724,
20013171637)
Rev <- rep(1000, 6)
Source <- c("App", "Non-App", "App", "Non-App", "Non-App", "Non-App")
data <- data.frame(customer_id, Sales_id, Rev, Source, stringsAsFactors = FALSE)
## Create Overview table
library(dplyr)
result <- data %>%
group_by(Source) %>%
summarise(No_of_customers = length(unique(customer_id)),
no_of_orders = length(unique(Sales_id)),
total_revenue = sum(Rev))
temp_res <- result[,-1]
temp_res <- rbind(temp_res, apply(temp_res, 2, sum))
temp_res <- rbind(temp_res, temp_res[1,]/temp_res[3,]*100)
cbind(Cat = c("App", "Non-App", "Total", "App%"), temp_res)
Однако я не рекомендую помещать итоги и доли в качестве дополнительной строки в data.frame. Вместо этого я бы сделал что-то подобное ...
library(tidyr)
result <- result %>%
pivot_longer(cols = -Source, names_to = "Cat")
## get Total
result %>%
group_by(Cat) %>%
summarise(Sum = sum(value))
## get Share
result %>%
group_by(Cat) %>%
summarise(App_share = value[Source == "App"] / sum(value))