Как создать новую таблицу, которая суммирует данные из другого фрейма данных? - PullRequest
1 голос
/ 04 февраля 2020

У меня есть фрейм данных df, данные которого выглядят как

dataset <- data.frame(customer_id = c(12,12,234,234,781,456),
                  Sales_id = c(20013211129, 20013217122, 20013149844, 20013273151, 20013222724, 20013171637),
                  Rev = c(1000,1000,1000,1000,1000,1000),
                  Source = c('App', 'Non-App', 'App', 'Non-App', 'Non-App', 'Non-App'))

customer_id |   Sales_id  | Rev | Source
       12     20013211129   1000  App
       12     20013217122   1000  Non-App
       234    20013149844   1000  App
       234    20013273151   1000  Non-App
       781    20013222724   1000  Non-App
       456    20013171637   1000  Non-App

Я хочу, чтобы таблица создавалась с использованием данных этого фрейма данных, который показывает результат как

........No_of_customers | no_of_orders | total_revenue
App         2                 2               2000
Non-App     4                 4               4000
Total       6                 6               6000
App%        33%               33%              33%   

Здесь количество клиентов определяется на основе количества различных customer_id, количество заказов - на счету sales_id, а общая сумма - это непосредственно общая сумма предшествующие два ряда. Я новичок в R, поэтому мне нужна помощь в отношении того, какие функции я должен использовать для этой работы

1 Ответ

1 голос
/ 04 февраля 2020

Здесь решение, возможно, не самое лучшее, но оно работает ...

## 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...