通过因子 B 的数值对因子 A 重新排序
reordering a factor A by the numeric values of a factor B
你好:我有一个看起来像这样的数据集。我的数据集,alpha、omega 和 zeta 是问题的名称。受访者被要求将党的领导人('Z'、'B' 或 'C')评为最能处理该问题的领导人。
我想显示每个问题的响应分布,但我希望看到排序的方面,以便第一个方面显示特定党派领导人(例如 Z)的最高百分比,然后向下移动。
在下面的代码中,我特别选择了跨越字母长度的变量名称(例如 alpha 到 zeta)并且没有设置种子,因为我想取回一些代码 always 对变量 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)
对于这样一个特定的用例,我会找到并明确设置顺序:
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
代码)是很好的自我记录。一种常见的注释最佳实践是 "comment why, not how,",代码会告诉您 发生了什么,注释主要用于解释 为什么。像这样(如下)的评论没有任何价值,反而会破坏您有意义的代码,使其更难阅读:
#count
count(Issue, Leader) %>%
在这里,你为百分比使用了一个很好的变量名,pct
,所以你不需要注释来告诉你它是什么:
#calculate percent
mutate(pct=n/sum(n)) %>%
你好:我有一个看起来像这样的数据集。我的数据集,alpha、omega 和 zeta 是问题的名称。受访者被要求将党的领导人('Z'、'B' 或 'C')评为最能处理该问题的领导人。
我想显示每个问题的响应分布,但我希望看到排序的方面,以便第一个方面显示特定党派领导人(例如 Z)的最高百分比,然后向下移动。
在下面的代码中,我特别选择了跨越字母长度的变量名称(例如 alpha 到 zeta)并且没有设置种子,因为我想取回一些代码 always 对变量 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)
对于这样一个特定的用例,我会找到并明确设置顺序:
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
代码)是很好的自我记录。一种常见的注释最佳实践是 "comment why, not how,",代码会告诉您 发生了什么,注释主要用于解释 为什么。像这样(如下)的评论没有任何价值,反而会破坏您有意义的代码,使其更难阅读:
#count
count(Issue, Leader) %>%
在这里,你为百分比使用了一个很好的变量名,pct
,所以你不需要注释来告诉你它是什么:
#calculate percent
mutate(pct=n/sum(n)) %>%