按两列的组总和比率重新排序因子——按要重新排序的因子分组。

4

I have a data frame, df:

  District TypeofSchool Nstudents Nteachers Percent_failure
1        A            I      1936       157            21.5
2        A           II        67         8             0.5
3        A          III      5288       146            78.0
4        B            I       653        72            27.8
5        B           II       865        22             9.0
6        B          III      2278       100            63.2

对于使用ggplot2进行图形绘制,我想要重新记录地区因素。我想按该地区的学生与教师比例对其进行排序,即汇总该地区所有类型学校的学生和教师人数并计算比率;通过该比率重新排列地区,以便在绘制堆积条形图时,最低比例地区将显示在最左侧位置:

ggplot(df, aes(x=District, y=Percent_failure, fill=TypeofSchool)) +
  geom_bar(stat="identity")

有什么建议如何重新排序?
4个回答

3

基本 R 解决方案(使用 dat 作为您的数据框)

stu.tea <- names(sort(by( 
             dat[c("Nstudents","Nteachers")],dat["District"],
             function(x) do.call("/",as.list(colSums(x)))
           )))
#[1] "B" "A"

dat$District <- factor(dat$District,levels=stu.tea)
dat$District
#[1] A A A B B B
#Levels: B A

2

以下是使用 data.table 的一种方法

require(data.table)
setDT(df)

df[ , ST.RAT := sum(Nstudents)/sum(Nteachers), by = District][order(ST.RAT)]
df[ , District := factor(District,levels=unique(as.character(District)))]

然后进行你的 ggplot 操作。


在data.table中,factor()的行为是否不同?因为factor只会按字母顺序排列级别吗? - MrFlick
感谢@Arun。我评论后代码已被编辑。 - MrFlick

1
使用dplyr:
dat = dat %>% group_by(District) %>% mutate(RST=sum(Nstudents/sum(Nteachers))) %>% 
arrange(RST)

dat$District = factor(dat$District,levels(dat$District)[unique(dat$District)])

0

另一个dplyr解决方案:

df <- df %>% 
  group_by(District) %>% 
  mutate(RST=sum(Nstudents/sum(Nteachers))) %>% 
  arrange(RST) %>%
  mutate(District = factor(District,District)) # the factor levels are reset here

请注意,最后一行的工作原理是通过将因子级别的顺序设置为当前的df顺序来完成的,该顺序由arrange设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接