R:如何按多个列进行聚合和分组+;R中的图表
假设我有:R:如何按多个列进行聚合和分组+;R中的图表,r,aggregate,geom-col,R,Aggregate,Geom Col,假设我有: 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
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
之后,我需要将所有内容放在一个几何图形中,显示按服务器可视分组的条形图。:)
同样,如果一个客户机位于多个服务器上,那么它可以作为多个条形图存在
非常感谢您可以尝试以下方法:
library(dplyr)
library(ggplot2)
df %>%
group_by(Customer, Server) %>%
summarise(Size = sum(Size)) %>%
ggplot() + aes(x = Server, y = Size, fill = Customer) + geom_col()
数据
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))
df在base R
中进行聚合的另一个解决方案是:
df3 <- aggregate(df$Size, list(df$Customer, df$Server), sum)
为方便起见,请使用df
中的列名重命名列:
使用新列名绘制堆叠条形图:
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
names(df3) <- names(df)
谢谢。我试图理解为什么您的代码可以工作,但如果我用我的数据执行它,则不会:)。请给我一些时间调查一下。关于图表-这将适用于少量客户,但在我的情况下,客户总数超过70-80,简单的颜色编码将不可读。这就是为什么我用单独的(但按服务器分组的)客户机在每个条上都有标签。难看,但可读。这将是一个带有水平条的高图表,以便能够向下滚动。@YavorI您会得到什么错误?你能检查一下我在文章末尾分享的数据,看看它是否能与这些数据一起工作吗?是的-你的数据很好,这意味着我做错了什么:ggplot(df2)+aes(x=Server,y=x,fill=Customer)+geom_col()错误:数据必须是一个数据帧,或者其他可由fortify()
强制的对象,非整数向量运行rlang::last_error()
查看错误发生的位置。>source('C:/00-HOME/R/backups\u byclientandvault.R',echo=TRUE)source中的错误('C:/00-HOME/R/backups\u byclientandvault.R',echo=TRUE):C:/00-HOME/R/backups\u byclientandvault.R:38:34:意外“='37:分组人(backups$CustomerName,backups$Vault)%>%38:摘要(backups$OriginalSize=我收到一个错误:错误:数据
必须是一个数据帧,或者是可由fortify()
强制的其他对象,而不是整数向量谢谢。现在代码甚至可以处理我的数据:)问题仍然是图形本身-在您的示例中,条形图是客户(总共80个)。颜色是每个保险库的颜色。这几乎是我所需要的。例如,如果我的客户数量较少,仅更改x和y就足够了,因为每个保险库都会清楚地显示哪些客户已满。但是,这些客户太多了,没有空间放置标签,并且80种不同颜色的颜色编码将无法读取。请看看这个丑陋的例子:我不确定我是否理解。也许,如果Server
值的数量小于客户数量,你可以这样做:ggplot(df3)+aes(x=Customer,y=Size,fill=Server)+geom_col()
。请尝试一下,并让我知道它是否适合您。是的,我已经这样做了,但在本例中,重点是-客户在哪里保存他们的数据。这很有用,我将保留此数据。但我还需要-相反-每个服务器作为客户端的内容是什么。我需要客户端条,但按服务器进行可视化分组。在这个c假设每个客户都会有超过1个条,因为有时客户会同时在2或3个不同的服务器上坚持。“我需要客户条,但按服务器直观地分组。”--这就是堆叠条图所显示的。因此,我不确定我是否理解您的问题。
ggplot(df3) + aes(x = Server, y = Size, fill = Customer) + geom_col()