R聚合为百分比计数

时间:2017-01-30 15:02:06

标签: r ggplot2

使用如下所示的数据框df1 - 我需要按make

创建汽车百分比数量的可视化
+-----------------------------------------+
|reg   |make  |model  |year|abs  |gears|fm|
+-----------------------------------------+
|ax1234|Toyota|Corolla|1999|true |6    |0 |
|ax1235|Toyota|Corolla|1999|false|5    |0 |
|ax1236|Toyota|Corolla|1992|false|4    |NA|
|ax1237|Toyota|Camry  |2001|true |7    |1 |
|ax1238|Honda |Civic  |1994|true |5    |NA|
|ax1239|Honda |Civic  |2000|false|6    |0 |
|ax1240|Honda |Accord |1992|false|4    |NA|
|ax1241|Nissan|Sunny  |2001|true |6    |0 |
|ax1242|      |       |1998|false|6    |0 |
|ax1243|NA    |NA     |1992|false|4    |NA|
+-----------------------------------------+

我需要按make找到汽车的百分比 - 我这样做。

df2 <- aggregate(reg ~ addNA(make), df1, function(x){ return (length(x)/nrow(df1))})
> df2
  addNA(make) reg
1             0.1
2       Honda 0.3
3      Nissan 0.1
4      Toyota 0.4
5        <NA> 0.1
> 

最后,我按如下方式绘制条形图。

df3 <- df2[order(-df2[,2]),]
ggplot(df3, aes(x=df3[,1], y=df3[,2])) + geom_bar(stat = "identity") +
  xlab("make") + scale_y_continuous(labels = percent, name="perc")

给出了下面的情节。

问题 -

  1. 这是从数据到情节的正确方法 - 更好的建议欢迎
  2. 为什么标签中的标签不按百分比顺序排序?
  3. enter image description here

2 个答案:

答案 0 :(得分:1)

我建议在线浏览许多ggplot2教程。您可以通过多种方式简化代码,或者使用不同的工具,但这些方法会随着时间的推移而持续使用。

我相信您可以做的最大改进是使用您在通话中传递的数据中的裸变量名称。您还可以通过对不同geoms

的更广泛了解来节省一些打字

您面临的第二个问题是ggplot在大多数情况下确定数据中变量的顺序。使用您传递的离散数据,您需要按正确的顺序创建factor。您几乎就在那里,正确地对数据进行了排序。你只需要从中获得创造一个因素。

您的电话:

df2 <- aggregate(reg ~ addNA(make), df, function(x){ return (length(x)/nrow(df))})

df3 <- df2[order(-df2[,2]),]

ggplot(df3, aes(x=df3[,1], y=df3[,2])) + geom_bar(stat = "identity") +
  xlab("make") + scale_y_continuous(labels = percent, name="perc")

我的电话:

df2  <- aggregate(reg ~ make, df, function(x){ return (length(x)/nrow(df))})

order <- df2$make[order(-df2$reg)]

df2$make <- factor(df2$make, order)

ggplot(df2, aes(x = make, y = reg)) +
  geom_col() +
  scale_y_continuous(labels = percent) +
  labs(x = "Make", y = "Percent") 

我使用geom_col这是geom_bar(stat = "identity")labs()的快捷方式,可以在一次通话中设置多个标签。

enter image description here

答案 1 :(得分:0)

对于条形的顺序,如上所述,诀窍是使用因子,因为ggplot2将按字母顺序对字符进行排序。

您可以利用dplyr包来操作数据,而不必使用管道%>%运算符在每个步骤存储数据,该运算符将数据作为下一个函数的第一个参数传递。登记/> 这是我的版本:

library(dplyr)    # For data manipulation and the pipe (%>%) operator
library(forcats)  # For factor handling (here fct_reorder())
library(ggplot2)  # For plots
library(scales)   # For percent scale

# Start with the data frame and pass it with the pipe to the next function
df1 %>% 
  # Then we group it by make
  group_by(make) %>% 
  # We summarise by vreating a prop variable, n() returns the number of row by group
  summarise(prop = n()/nrow(df1)) %>% 
  # We then transform the make variable into a factor, the order of the level
  # given by -prop (to have it in decreasing order)
  mutate(make = fct_reorder(make, -prop)) %>% 
  # And we pass it to the plot
  # Notice the transition to + instead of %>% 
  ggplot(aes(x = make, y = prop)) +
    geom_col() +
    scale_y_continuous(label = percent) +
    labs(x = "Make", y = "Percent")

另请注意,对我来说,NAs存储为NA而不是字符串"NA",因此无论值如何,都将绘制为最后一个条形图。