R: Как агрегировать и группировать по более чем одному столбцу + диаграмма в R - PullRequest
0 голосов
/ 05 апреля 2020

Допустим, у меня есть это:

Customer Server Size
Cus_a    Ser_1  3
Cus_a    Ser_1  4
Cus_a    Ser_2  2
Cus_b    Ser_2  1
Cus b    Ser_2  3
Cus_b    Ser_2  2
Cus_c    Ser_2  4
Cus c    Ser_2  1
Cus_c    Ser_3  4

Мне нужно агрегировать новую форму данных, которая показывает общий размер каждого клиента на каждом сервере, например:

Cus_a Ser_1 7
Cus_a Ser_2 2
Cus_b Ser_2 6
Cus_c Ser_2 5
Cus_c Ser_3 4

И после этого я нужно поместить все в geom_col, который показывает столбцы, визуально сгруппированные по серверу. :) Итак, еще раз - один клиент может существовать в виде более 1 бара на графике, если он расположен более чем на одном сервере

Большое спасибо

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Другое решение, в котором агрегирование выполняется в base R, заключается в следующем:

df3 <- aggregate(df$Size, list(df$Customer, df$Server), sum)

Обратите внимание на измененные имена столбцов:

df3
  Group.1 Group.2 x
1   Cus_a   Ser_1 7
2   Cus_a   Ser_2 2
3   Cus_b   Ser_2 6
4   Cus_c   Ser_2 5
5   Cus_c   Ser_3 4

Для удобства переименуйте столбцы, используя имена столбцов в df:

Нарисуйте составную гистограмму, используя новые имена столбцов:

names(df3) <- names(df)

Теперь нарисуйте составную гистограмму:

ggplot(df3) + aes(x = Server, y = Size, fill = Customer) + geom_col()

enter image description here

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

Вы можете попробовать это:

library(dplyr)
library(ggplot2)

df %>%
  group_by(Customer, Server) %>%
  summarise(Size = sum(Size)) %>%
  ggplot() + aes(x = Server, y = Size, fill = Customer) + geom_col()

enter image description here

data

df <- structure(list(Customer = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 
3L, 3L, 3L), .Label = c("Cus_a", "Cus_b", "Cus_c"), class = "factor"), 
Server = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L), .Label = c("Ser_1", 
"Ser_2", "Ser_3"), class = "factor"), Size = c(3L, 4L, 2L, 
1L, 3L, 2L, 4L, 1L, 4L)), class = "data.frame", row.names = c(NA,-9L))
...