You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中让缺失最新年度数据的区域在因子排序中排末尾?

问题场景

现有如下R数据框:

Year = c("2015", "2015", "2015", "2015", "2015",  "2015", "2015", "2016", "2016", "2016", "2016", "2016", "2016",  "2016", "2017", "2017", "2017", "2017", "2017", "2017", "2017",  "2018", "2018", "2018", "2018", "2018", "2018", "2019", "2019",  "2019", "2019", "2019", "2019")

Region = c("World", "Africa", "Middle East", "Europe", "America", "Asia", "Other", 
"World", "Africa", "Middle East", "Europe", "America", "Asia", "Other", "World", "Africa", "Middle East", "Europe", "America", "Asia", "Other", "World", "Africa", "Middle East", "Europe", "America", "Asia", "World", "Africa", "Middle East", "Europe", "America", "Asia")

Sales = c(914141282, 1944898318,  4364067461, 11300678829, 16278485843, 132612907539, 6014323190,  1423729376, 2594259389, 3953198670, 12218027505, 17074884991,  140098809735, 6476302180, 1824592711, 4001928375, 4487385252,  13386187005, 19482623313, 173213703884, 8678149745, 2515250712,  3025785028, 5264852268, 15280791380, 20221401985, 187302084150,  1970503832, 2900497180, 5776217486, 16459966376, 22412702838,  200321533591)

df <- data.frame(Year, Region, Sales)

想要按最后一年(2019年)的Sales数值对Region排序,并转为因子类型,最初使用的代码:

order <- subset(df, Year == max(Year), select = c("Region","Sales")) %>% arrange(-desc(Sales)) %>% select(Region)
df$Region <- factor(df$Region, levels = order$Region)

但"Other"区域在2019年无数据,仅在2015、2016、2017年存在,导致转因子后该区域变为NA:

Year      Region        Sales
...
7  2015        <NA>   6014323190
...
14 2016        <NA>   6476302180
...
21 2017        <NA>   8678149745
...

需求:将2019年无数据的区域排在因子排序的末尾,同时保留这些区域的原始值,不转为NA。


解决方案

核心思路是:先获取2019年有数据的区域并按Sales降序排序,再把所有在数据框中存在但2019年没数据的区域追加到排序结果的末尾,以此作为因子的水平。

修正后的代码如下:

library(dplyr)

# 获取最后一年的年份值
last_year <- max(df$Year)

# 提取2019年有数据的区域,按Sales降序排序
ordered_regions <- df %>%
  filter(Year == last_year) %>%
  arrange(desc(Sales)) %>%
  pull(Region)

# 获取所有在df中存在的区域,筛选出2019年没有的区域
missing_regions <- setdiff(unique(df$Region), ordered_regions)

# 组合最终的因子水平:2019年排序后的区域 + 缺失的区域
final_levels <- c(ordered_regions, missing_regions)

# 将Region转为因子,指定水平
df$Region <- factor(df$Region, levels = final_levels)

代码解释

  1. 获取最后一年:用max(df$Year)确定目标年份(2019),避免硬编码年份,增强代码通用性。
  2. 排序2019年的区域:通过filter筛选2019年数据,arrange(desc(Sales))按销售额降序排列,pull(Region)提取排序后的区域名称。
  3. 找出缺失的区域:用setdiff对比所有存在的区域和2019年有数据的区域,得到在2019年无数据的区域(即"Other")。
  4. 组合因子水平:把排序后的区域放在前面,缺失区域放在末尾,确保无2019年数据的区域排在最后。
  5. 转因子类型:指定levels为组合后的结果,这样原有数据中的"Other"就不会被转为NA,且排序符合要求。

测试后可以看到,df中的"Other"区域保留原值,且在因子排序中处于末尾。


内容的提问来源于stack exchange,提问作者Underwood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:16:05