对不起,我已经尽了最大努力,但我找不到答案。作为初学者,我不确定我是否能够清楚地提出这个问题。提前致谢。
所以我有一个包含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%。 我想我们能为你做点什么吗?
非常感谢!!
答案 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")