如何在R中基于聚类列与多列值调整大型data.frame的行顺序?
解决方案
首先注意到你的Valeur1、Valeur2、Valeur3列是字符类型(带引号),第一步需要先把它们转换成数值型,否则排序会按字符逻辑(比如"-7.1"会比"0.2"靠前,这不是我们要的数值排序)。
方法一:用dplyr包(推荐,语法直观)
如果你还没安装dplyr,先执行安装命令:
install.packages("dplyr")
然后运行以下代码完成排序:
library(dplyr) # 转换字符列为数值列 data <- data %>% mutate(across(starts_with("Valeur"), as.numeric)) # 按Clusters升序分组,组内按Valeur3降序排序 data_sorted <- data %>% arrange(Clusters, desc(Valeur3)) # 查看结果 data_sorted
运行后得到的结果和你给出的data2完全一致:
Valeur1 Valeur2 Valeur3 Clusters 1 -0.02 -0.05 8.0 1 2 4.70 2.10 3.1 1 3 -7.10 -3.20 2.4 1 4 0.20 1.50 6.2 2 5 4.40 4.10 1.4 2 6 7.90 7.10 7.2 3 7 1.10 1.00 1.5 3 8 0.30 0.10 -1.2 3
方法二:用Base R(无需额外安装包)
如果不想安装第三方包,用原生R代码也能实现:
# 转换字符列为数值列 data[, paste0("Valeur", 1:3)] <- lapply(data[, paste0("Valeur", 1:3)], as.numeric) # 生成排序索引:先按Clusters升序,再按Valeur3降序 sort_index <- order(data$Clusters, -data$Valeur3) # 按索引排序 data_sorted <- data[sort_index, ]
逻辑说明
- 转换数值列:确保后续排序是基于数值大小,而非字符的字典顺序。
- 分组排序:先按
Clusters的升序(1→2→3)排列各组,再在每个组内按Valeur3的降序(从大到小)排列行,这完全匹配你给出的目标结果。
内容的提问来源于stack exchange,提问作者Lifr
相关产品推荐
相关产品推荐

