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

У меня есть данные, которые выглядят так:

| Employee | Employee_id | Transaction_date | Expense_Type    | Attendees | Vendor       | Purpose                     | Amount |
|----------|:-----------:|-----------------:|-----------------|-----------|--------------|-----------------------------|--------|
| Nancy    |      1      |       12/27/2018 | Individual_Meal | NA        | Chiles       | Dinner in NYC               | 128    |
| David    |      2      |         9/9/2017 | Group_Meal      | Jess      | Renaissance  | External Business Meeting   | 600    |
| David    |      2      |         9/9/2017 | Group_Meal      | Peter     | Renaissance  | External Business Meeting   | 600    |
| David    | 2           | 9/9/2017         | Group_Meal      | David     | Renaissance  | External Business Meeting   | 600    |
| John     | 3           | 10/4/2017        | Group_Meal      | Mike      | Subway       | Lunch with Mike and Maximus | 130    |
| Mary     | 4           | 1/16/2019        | Group_Meal      | Carol     | Olive_Garden | summit with Intel           | 235    |
| Mary     | 4           | 1/16/2019        | Group_Meal      | Sonia     | Olive_Garden | summit with Intel           | 235    |
| Mary     | 4           | 1/16/2019        | Group_Meal      | James     | Olive_Garden | summit with Intel           | 235    |
| Mary     | 4           | 1/16/2019        | Group_Meal      | Mary      | Olive_Garden | summit with Intel           | 235    |
| John     | 3           | 10/4/2017        | Group_Meal      | Maximus   | Subway       | Lunch with Mike and Maximus | 130    |
| John     | 3           | 10/4/2017        | Group_Meal      | John      | Subway       | Lunch with Mike and Maximus | 130    |
| Richard  | 5           | 4/11/2018        | Individual_Meal | NA        | Dominos      | Dinner in Ohio              | 50     |

Я хочу агрегировать таблицу таким образом, чтобы я мог видеть количество посетителей для каждого сотрудника и общие расходы, понесенные для них. Итоговая таблица должна выглядеть примерно так:

| Employee | Employee_id | Transaction_date | Expense_Type    | Vendor       | Purpose                     | No_of_Attendee | Total_Amount |
|----------|:-----------:|-----------------:|-----------------|--------------|-----------------------------|----------------|--------------|
| Nancy    |      1      |       12/27/2018 | Individual_Meal | Chiles       | Dinner in NYC               | 1              | 128          |
| David    |      2      |         9/9/2017 | Group_Meal      | Renaissance  | External Business Meeting   | 3              | 1800         |
| John     |      3      |        10/4/2017 | Group_Meal      | Subway       | Lunch with Mike and Maximus | 3              | 390          |
| Mary     | 4           | 1/16/2019        | Group_Meal      | Olive_Garden | summit with Intel           | 4              | 940          |
| Richard  | 5           | 4/11/2018        | Individual_Meal | Dominos      | Dinner in Ohio              | 1              | 50           |

Затем я хочу создать график области, где у меня есть «дата транзакции» по оси x и «сумма» по оси y с различными переменными, такими как поставщик, цель, указанная во всплывающей подсказке. Я пробовал код, но не уверен, как рассчитать частоту и сумму двух разных столбцов, сохранив при этом другие столбцы, как показано в желаемой выходной таблице. Кроме того, когда я пытаюсь использовать текст в ggplot2, график с областями работает нормально, пока не будет упомянут только сотрудник. Как только я добавляю поставщика и / или цель, график областей меняется. Я не уверен, почему это происходит. Может ли кто-нибудь взглянуть на мой код и сообщить, что не так и как это исправить?

library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
df4=read_excel("C:/Users/xyz/Desktop/eg1.xlsx")
df4_freq=df4 %>% group_by(Employee,Employee_id,Transaction_date,Vendor,Purpose,Expense_Type,
                              Amount) %>% summarise(count=n())
colnames(df4_freq)[8]= "No_of_Attendee"
plot=ggplot(d4_freq, aes(x = Transaction_date, y = Amount, 
                         text=paste('Employee:',Employee,
                                    '<br>No of Attendees:', No_of_Attendee,
                                    '<br>Amount Per Attendee:', Amount,
                                    '<br>Purpose:', Purpose,
                                    '<br>Vendor:', Vendor
                                    ))) + 
  geom_area(aes(color = Expense_Type, fill = Expense_Type), 
            alpha = 0.5, position = position_dodge(0.8))+
  geom_point(colour="black")+
  scale_color_manual(values = c("#CC6600", "#606060")) +
  scale_fill_manual(values = c("#CC6600", "#606060"))
plot=ggplotly(p, tooltip = c("x","y","text"))
plot

ЧАСТЬ 2: Другая проблема, с которой я столкнулся, связана с графиком площадей. Если я введу только «сотрудник» в качестве переменной в «тексте», мой сюжет будет идеальным. Но когда я ввожу другие переменные, такие как «No_of_Attendee», «Vendor» и т. Д., Мой график меняется на прямые. Есть ли проблема с ggplotly или текстом? Для справки, я снова отправляю код, так как добавил в него еще несколько данных.

library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
df4=data.frame("Employee"=c("Nancy","David","David","David","John","Mary","Mary","Mary","Mary",
"John","John","Richard","David","David","Mary","Mary","Mary"), 
"Employee_id"=c(1,2,2,2,3,4,4,4,4,3,3,5,2,2,4,4,4),
"Transaction_date"=c("12/27/2018","9/9/2017","9/9/2017","9/9/2017","10/4/2017","1/16/2019",
"1/16/2019","1/16/2019","1/16/2019","10/4/2017","10/4/2017","4/11/2018","1/1/2018","1/1/2018",
"4/5/2018","4/5/2018","4/5/2018"), 
"Expense_Type"=c("Individual_Meal","Group_Meal","Group_Meal","Group_Meal","Group_Meal",
"Group_Meal","Group_Meal","Group_Meal","Group_Meal","Group_Meal", "Group_Meal",
"Individual_Meal","Group_Meal","Group_Meal","Group_Meal" ,"Group_Meal","Group_Meal"),
"Attendees"=c("NA","Jess","Peter","David","Mike","Carol","Sonia","James","Mary","Maximus",
"John","NA","Arya","David","Jon","Elizabeth","Marco"),
"Vendor"=c("Chiles","Renaissance","Renaissance","Renaissance","Subway","Olive_Garden","Olive_Garden",
"Olive_Garden","Olive_Garden","Subway","Subway","Dominos","BJ","BJ","Little_Italy","Little_Italy","Little_Italy"),
"Purpose"=c("Dinner in NYC","External Business Meeting","External Business Meeting","External Business Meeting",
"Lunch with Mike and Maximus","summit with Intel","summit with Intel","summit with Intel","summit with Intel",
"Lunch with Mike and Maximus","Lunch with Mike and Maximus","Dinner in Ohio","Lunch with Arya","Lunch with Arya",
"Business_Meeting","Business_Meeting","Business_Meeting"),
"Amount"= c(128,600,600,600,130,235,235,235,235,130,130,50,95,95,310,310,310))
str(df4)
df4$Transaction_date<- as.Date(df4$Transaction_date, "%m/%d/%Y")
df4_freq=df4 %>% group_by(Employee,Employee_id,Transaction_date,Vendor,Purpose,Expense_Type)%>% summarise(No_of_Attendee=n(), Total_Amount=sum(Amount))

plot=ggplot(df4_freq, aes(x = Transaction_date, y = Total_Amount, 
                         text=paste('Employee:',Employee))) + 
  geom_area(aes(color = Expense_Type, fill = Expense_Type), 
            alpha = 0.5, position = position_dodge(0.8))+
  geom_point(colour="black")+
  scale_color_manual(values = c("#CC6600", "#606060")) +
  scale_fill_manual(values = c("#CC6600", "#606060"))
plot=ggplotly(plot, tooltip = c("x","y","text"))
plot 

Ниже приведен график, который выглядит идеально, только с переменной «Сотрудник» в тексте. введите здесь описание изображения

Однако, когда я включаю другие переменные, такие как «No_of_Attendee», «Vendor» и т. Д., Мой график выглядит как одна строка. Ниже код и сюжет.

plot=ggplot(df4_freq, aes(x = Transaction_date, y = Total_Amount, 
                         text=paste('Employee:',Employee,
                                    '<br>No of Attendees:', No_of_Attendee,
                                     '<br>Total_Amount:', Total_Amount,
                                     '<br>Purpose:', Purpose,
                                     '<br>Vendor:', Vendor
                                    ))) + 
  geom_area(aes(color = Expense_Type, fill = Expense_Type), 
            alpha = 0.5, position = position_dodge(0.8))+
  geom_point(colour="black")+
  scale_color_manual(values = c("#CC6600", "#606060")) +
  scale_fill_manual(values = c("#CC6600", "#606060"))
plot=ggplotly(plot, tooltip = c("x","y","text"))
plot 

введите здесь описание изображения

Было бы здорово и полезно, если бы кто-нибудь помог мне в том, что не так с моим кодом.


person hk2    schedule 28.04.2019    source источник
comment
Будет намного легче помочь, если вы сможете поделиться своими данными таким образом, чтобы другим было легко загружать их и экспериментировать. Лучше всего включить в текст вашего вопроса результат выполнения этого на некоторых репрезентативных данных: dput(head(YOUR_DATA)).   -  person Jon Spring    schedule 28.04.2019
comment
Что касается первого вопроса, я бы ожидал чего-то вроде замены %>% summarise(count=n()) на %>% summarise(No_of_Attendee = sum(!is.na(Attendees)), Total_Amount = sum(Amount))   -  person Jon Spring    schedule 28.04.2019
comment
@ Спасибо, Джон! Я сохраню ваше предложение в голове в следующий раз.   -  person hk2    schedule 29.04.2019


Ответы (1)


Похоже, что группировка по сумме препятствует вычислению Total_Amount. Например, David's Meal 9/9/2017 создаст группу, которая представляет эти три строки, но тогда вы можете суммировать только с помощью count = n (), который будет подсчитывать количество строк в этой группе. Но поскольку вы сгруппированы по сумме, вы не сможете создать строку, которая суммирует Total_Amount. Я бы предложил следующее для создания набора данных, который вы ищете:

data %>%
  group_by(Employee, Employee_id, Transaction_date, Expense_Type, Vendor, Purpose) %>%
  summarize(No_of_Attendee = n(),
            Total_Amount = sum(Amount))
person mcz    schedule 28.04.2019
comment
Спасибо @mcz! Я пропустил ту часть суммы, которую вы упомянули в своем ответе. Когда я строю график с помощью geom_area, возникает еще одна проблема. С моими исходными данными, когда я включаю только «Сотрудник» в «текст» в соответствии с эстетикой ggplot, мой график абсолютно идеален, но если я добавлю любую другую переменную, такую ​​как «количество участников», «цель» и т. Д., График превращается в вид гистограммы. Код указан выше в моем посте. - person hk2; 29.04.2019
comment
@ hk2 Добро пожаловать! Я не уверен, в чем проблема? Не могли бы вы добавить больше данных и, возможно, изображение того, как вы надеетесь, что график может выглядеть? Я пробовал использовать ваш код с данными, предоставленными в качестве примера, но независимо от того, что я помещаю в текстовое поле, я получаю строки с точками вверху для каждой даты в наборе данных. - person mcz; 29.04.2019
comment
Я внес правки в свой пост относительно моей проблемы с сюжетом. Я внес некоторые правки в код и данные - person hk2; 29.04.2019