R由变量聚合然后找出每列的比例

时间:2017-05-20 00:07:11

标签: r bar-chart plyr

对不起,我已经尽了最大努力,但我找不到答案。作为初学者,我不确定我是否能够清楚地提出这个问题。提前致谢。

所以我有一个包含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%。 我想我们能为你做点什么吗?

非常感谢!!

2 个答案:

答案 0 :(得分:0)

temp <- aggregate( . ~ profession, data=zzz, FUN=sum)
cbind(temp[1],temp[-1]/rowSums(temp[-1]))

或使用prop.table

答案 1 :(得分:0)

正如其他人所说的那样,发布一个可重复的例子总是更好,我会尝试用我的解决方案发布一个,这比已发布的解决方案更长,但出于同样的原因,可能更清楚。

首先,您应该创建一个示例数据框:

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

获得数据框后,您可以解释到目前为止您尝试过的内容或可能的解决方案。我在这里使用了dplyr

df <- df %>% group_by(profession) %>% summarize(coats = sum(NumberOfCoat),
                                            shirts = sum(NumberOfShirt),
                                            shoes = sum(NumberOfShoes)) %>%
             mutate(tot_prod = coats + shirts + shoes,
                    ProportionOfCoat = coats/tot_prod,
                    ProportionOfShirt = shirts/tot_prod,
                    ProportionofShoes = shoes/tot_prod) %>%
            select(profession, ProportionOfCoat, ProportionOfShirt, 
                   ProportionofShoes)

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。正如@alistaire所说,您可以使用gather包中的tidyr函数来完成此操作。

df <- df %>% gather(product, proportion, -profession) 

最后,您可以使用ggplot2绘制它。

ggplot(df, aes(x=profession, y=proportion, fill=product)) + 
       geom_bar(stat="identity") 

enter image description here