R通过一个变量进行聚合,然后计算出每列的百分比
对不起,我已经尽力了,但是我没有找到答案。作为初学者,我不确定我是否能把问题说清楚。提前谢谢 因此,我有一个数据框,其中包含24000行的消费数据。 在此数据框中,有一系列关于过去两个月内购买的对象数量的变量:R通过一个变量进行聚合,然后计算出每列的百分比,r,bar-chart,plyr,R,Bar Chart,Plyr,对不起,我已经尽力了,但是我没有找到答案。作为初学者,我不确定我是否能把问题说清楚。提前谢谢 因此,我有一个数据框,其中包含24000行的消费数据。 在此数据框中,有一系列关于过去两个月内购买的对象数量的变量: NumberOfCoat,NumberOfShirt,NumberOfPants,NumberOfShoes… 还有一个变量“职业”是按编号注册的 所以现在数据看起来像这样 profession NumberOfCoat NumberOfShirt Numb
NumberOfCoat,NumberOfShirt,NumberOfPants,NumberOfShoes…
还有一个变量“职业”是按编号注册的 所以现在数据看起来像这样
profession NumberOfCoat NumberOfShirt NumberOfShoes
individu1 1 1 1 1
individu2 3 2 4 1
individu3 2 2 0 0
individu4 6 0 3 2
individu5 5 0 2 3
individu6 7 1 0 5
individu7 4 3 1 2
我想知道按职业划分的消费结构,得到如下信息:
ProportionOfCoat ProportionOfShirt ProportionOfShoe...
profession1 0.3 0.5 0.1
profession2 0.1 0.2 0.4
profession3 0.2 0.6 0.1
profession4 0.1 0.1 0.2
我不知道这是否清楚,但最后我想说:
医生购买的服装产品中有10%是T恤,而教师购买的服装产品中有20%是T恤
最后,我想画一个叠加的条形图,每个叠加都被缩放到100%。
我想我们能帮你解决问题吗
非常感谢
temp正如其他人所指出的,发布一个可复制的示例总是更好的,我将尝试发布一个带有我的解决方案的示例,它比已经发布的示例更长,但出于同样的原因,可能更清晰
temp <- aggregate( . ~ profession, data=zzz, FUN=sum)
cbind(temp[1],temp[-1]/rowSums(temp[-1]))
首先,您应该创建一个示例数据帧:
set.seed(10) # I set a seed cause I´ll use the sample() function
n <- 1:100 # vector from 1 to 100 to obtain the number of products bought
p <- 1:8 # vector for obtaining id of professions
profession <- sample(p,50, replace = TRUE)
NumberOfCoat <- sample(n,50, replace = TRUE)
NumberOfShirt <- sample(n,50, replace = TRUE)
NumberOfShoes <- sample(n,50, replace = TRUE)
df <- as.data.frame(cbind(profession, NumberOfCoat,
NumberOfShirt, NumberOfShoes))
df
对应于您显示的第二个数据框,其中您有每个专业购买的每个产品的比例。在我的示例中,如下所示:
profession ProportionOfCoat ProportionOfShirt ProportionofShoes
<int> <dbl> <dbl> <dbl>
1 1 0.3910483 0.2343934 0.3745583
2 2 0.4069641 0.3525571 0.2404788
3 3 0.3330804 0.3968134 0.2701062
4 4 0.2740657 0.3952435 0.3306908
5 5 0.2573991 0.3784753 0.3641256
6 6 0.2293814 0.3543814 0.4162371
7 7 0.2245841 0.3955638 0.3798521
8 8 0.2861635 0.3490566 0.3647799
最后,您可以使用ggplot2
打印它
ggplot(df, aes(x=profession, y=proportion, fill=product)) +
geom_bar(stat="identity")
库(dplyr);df%>%group\u by(profession)%%>%summary\u all(sum)%%>%mutate\u at(vars(-professional),prop.table)
欢迎使用堆栈溢出。这不仅仅是一个问题。请一次只问一个问题。另外,请展示你试图得到的答案……而且你甚至不需要聚合来制作条形图;只需使用position='fill'
:库(tidyverse);df%>%gather(df,var,val,-professional)%>%ggplot(aes(professional,val,fill=var))+geom_col(position='fill')
非常感谢您的患者回复。它在全球范围内为我的工作。然而,我认为这是因为我的数据中的NAs,不同产品按专业划分的比例之和不是100%。。。在最后的酒吧不是均匀的长度。。。你能告诉我怎么办吗?再次感谢!哦我想可能是因为不同职业的人口不平等。。。。就像我的职业1有20人,职业2有300人,职业3有84人……:'(这应该不是问题,我提供的数据具有相同的特征,df%>%groupby(profession)%%>%summary(np=n())
,您可以检查每个职业的个体数量是否不同。
df <- df %>% gather(product, proportion, -profession)
ggplot(df, aes(x=profession, y=proportion, fill=product)) +
geom_bar(stat="identity")