R通过一个变量进行聚合,然后计算出每列的百分比

R通过一个变量进行聚合,然后计算出每列的百分比,r,bar-chart,plyr,R,Bar Chart,Plyr,对不起,我已经尽力了,但是我没有找到答案。作为初学者,我不确定我是否能把问题说清楚。提前谢谢 因此,我有一个数据框,其中包含24000行的消费数据。 在此数据框中,有一系列关于过去两个月内购买的对象数量的变量: NumberOfCoat,NumberOfShirt,NumberOfPants,NumberOfShoes… 还有一个变量“职业”是按编号注册的 所以现在数据看起来像这样 profession NumberOfCoat NumberOfShirt Numb

对不起,我已经尽力了,但是我没有找到答案。作为初学者,我不确定我是否能把问题说清楚。提前谢谢

因此,我有一个数据框,其中包含24000行的消费数据。 在此数据框中,有一系列关于过去两个月内购买的对象数量的变量:
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")