如何保持ID列原有顺序,对DataFrame的Value列分组排序
解决方案:保持ID原始出现顺序的分组排序
首先构造你的示例数据:
df <- data.frame( ID = c(37, 23, 51, 37, 23, 51), Value = c("+6", "+9", "+13", "-14", "-17", "-20"), stringsAsFactors = FALSE )
方法一:Base R 实现
核心思路是利用match()获取ID的首次出现位置,以此作为排序依据:
# 提取ID的首次出现顺序 id_unique_order <- unique(df$ID) # 按ID的首次出现顺序排序,自动将相同ID的行聚合,且保留组内原始顺序 df_sorted <- df[order(match(df$ID, id_unique_order)), ]
方法二:dplyr(Tidyverse)实现
如果习惯使用tidyverse工具链,可以通过因子指定排序层级:
library(dplyr) # 提取ID的首次出现顺序 id_unique_order <- unique(df$ID) # 将ID转为因子(指定levels为首次出现顺序),再排序 df_sorted <- df %>% mutate(ID = factor(ID, levels = id_unique_order)) %>% arrange(ID) %>% mutate(ID = as.integer(ID)) # 可选:将ID转回整数类型
两种方法最终得到的df_sorted都会符合你的要求:相同ID的行聚合在一起,ID的整体顺序严格遵循原数据的首次出现顺序(37→23→51),且每组内的Value顺序保持原数据的状态。
内容的提问来源于stack exchange,提问作者ginn
相关产品推荐
相关产品推荐

