通过因子B的数值对因子A重新排序

时间:2018-07-18 20:20:26

标签: r forcats

您好:我有一个看起来像这样的数据集。我的数据集是alpha,omega和zeta。要求受访者将政党领袖(“ Z”,“ B”或“ C”)评为最能解决该问题的领袖。

我想显示每个问题的回答分布,但是我想看到这些方面被排序为使得第一个方面显示特定党魁(例如Z)的最高百分比,然后向下移动。

在下面的代码中,我专门选择了跨越字母长度的变量名(例如,alpha到zeta),并且不设置种子,因为我想找回总是 排序的代码变量Issue的级别,使得第一个级别是党组长Z得分最高的问题,而第二个级别是党组长Z得分第二高的问题。

#load libraries
library(dplyr)
library(forcats)
library(tidyr)
library(ggplot2)

#In my data set these are issues, like taxes, health, etc. 
alpha<-sample(c('Z', 'B', 'C'), replace=T,size=300)
omega<-sample(c('Z', 'B', 'C'), replace=T,size=300)
zeta<-sample(c('Z', 'B', 'C'), replace=T, size=300)

#make data frame
df<-data.frame(alpha, omega, zeta)

df %>% 
  #gather into an issue variable and a leader variable
  gather(Issue, Leader) %>% 
  #count
  count(Issue, Leader) %>% 
  #form groups for counting percent
  group_by(Issue) %>% 
  #calculate percent
  mutate(pct=n/sum(n)) %>%
  #ungroup
  group_by(Leader)%>% 
  #try reordering based on
  mutate(Issue=fct_reorder(Issue, pct, .desc=F)) %>% 
  ggplot(., aes(x=Leader, y=pct))+geom_col()+facet_wrap(~Issue)

1 个答案:

答案 0 :(得分:1)

对于这样一个特定的用例,我将明确地找到并设置顺序:

df %>% 
  gather(Issue, Leader) %>% 
  count(Issue, Leader) %>% 
  group_by(Issue) %>% 
  mutate(pct=n/sum(n)) %>% 
  ungroup -> 
  plot_df

issue_order = filter(plot_df, Leader == "Z") %>% 
    arrange(desc(pct)) %>% 
    pull(Issue) %>%
    as.character

plot_df = mutate(plot_df, Issue = factor(Issue, levels = issue_order))

ggplot(plot_df, aes(x=Leader, y=pct))+geom_col()+facet_wrap(~Issue)

作为旁注,我鼓励您避免使用明显的注释来改善您的注释。注释代码很好,但是好的代码(尤其是dplyr代码)可以很好地自我记录。一种常见的注释最佳实践是“注释原因,而不是注释方式” ,因为该代码告诉您发生了什么的情况,注释主要是用来解释为什么< / em>。像这样的注释(如下)没有任何价值,而是破坏了有意义的代码,使其更难阅读:

#count
count(Issue, Leader) %>% 

在这里,您为百分号pct使用了一个很好的变量名,因此不需要注释就可以告诉您它是什么:

#calculate percent
mutate(pct=n/sum(n)) %>%