如何按2015年Rate降序分组排序R语言数据框?
解决按2015年Rate降序排列学校的dplyr方案
我来帮你搞定这个需求,用dplyr有两种实用方法,都能得到你想要的输出结果。
首先先还原你的数据集:
data2 <- structure( list( School = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("School1", "School2", "School3"), class = "factor"), Year = c(2015L, 2014L, 2013L, 2015L, 2014L, 2013L, 2015L, 2014L, 2013L), Rate = c(70L, 50L, 30L, 80L, 90L, 11L, 60L, 50L, 40L) ), .Names = c("School", "Year", "Rate"), class = "data.frame", row.names = c(NA, -9L) )
方法一:先定义学校排序顺序,再转换为有序因子
这种方法逻辑清晰,先明确提取出想要的学校排序规则,再应用到原数据上:
library(dplyr) # 第一步:获取按2015年Rate降序排列的学校列表 school_order <- data2 %>% filter(Year == 2015) %>% arrange(desc(Rate)) %>% pull(School) # 第二步:将School转换为有序因子,按上述顺序排序,同时保证每个学校内年份从新到旧 sorted_data <- data2 %>% mutate(School = factor(School, levels = school_order, ordered = TRUE)) %>% arrange(School, desc(Year)) # 查看结果 sorted_data
运行后输出就是你预期的:
School Year Rate 1 School2 2015 80 2 School2 2014 90 3 School2 2013 11 4 School1 2015 70 5 School1 2014 50 6 School1 2013 30 7 School3 2015 60 8 School3 2014 50 9 School3 2013 40
步骤解释:
school_order:筛选出2015年的数据,按Rate降序排列后提取学校名称,得到School2 → School1 → School3的排序逻辑。mutate:把原数据的School列转为有序因子,指定levels为刚才得到的顺序,这样后续排序会遵循这个规则,而不是因子默认的创建顺序。arrange:先按School的有序顺序排序,再按Year降序,保证每个学校内的年份从新到旧排列。
方法二:链式计算临时排序键,直接排序
这种方法更简洁,不需要单独提取排序列表,通过添加临时列完成排序后再删除:
library(dplyr) sorted_data <- data2 %>% # 为每个学校添加2015年的Rate作为排序键 group_by(School) %>% mutate(rate_2015 = first(Rate[Year == 2015])) %>% ungroup() %>% # 按2015年Rate降序,再按年份降序排序 arrange(desc(rate_2015), desc(Year)) %>% # 移除临时添加的排序键列 select(-rate_2015) # 查看结果 sorted_data
步骤解释:
group_by(School)后,mutate(rate_2015 = first(Rate[Year == 2015])):为每个学校的所有行添加2015年的Rate值作为临时排序依据。ungroup()取消分组,确保后续的排序是全局生效的。arrange:先按临时列rate_2015降序排列学校,再按Year降序排列每个学校内的行。select(-rate_2015):删除临时列,得到干净的目标数据集。
两种方法都能完美实现你的需求,你可以根据自己的习惯选择使用。
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

