Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:如何按多个列进行聚合和分组+;R中的图表_R_Aggregate_Geom Col - Fatal编程技术网

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()