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

如何在R中保留DataFrame分组聚合后的变量顺序?

保留分组原始顺序计算均值的解决方案

问题背景

现有如下R数据集:

structure(list(PCV = c(0.0178219194071478, 0.0167224679086922, 0.0313796054695457, 0.0272633405874291, 0.00992979365423812, 0.0163545593623028, 0.0125615766079409, 0.0438832908556275, 0.0260965005930162, 0.034959332834335, 0.00651124339985815, 0.00773667420172548, 0.00460174240773309, 0.00940417833578374, 0.00763277410224326, 0.0569674690437892, 0.00554001729154236, 0.0102426634114334, 0.0191710901533892, 0.0127379038986653, 0.00859900586552533, 0.00630188507834846, 0.000184250143156493, 0.00651494443035729, 0.00477417309479366, 0.0298096494477779, 0.0235443699348768, 0.00846982190170002, 0.0197493082323879, 0.00885420900157687, 0.00771739026182587, 0.0227915291110601, 0.000326021119179784, 0.00347808426299245, 0.00244844394159794, 0.0221243684669031, 0.00853034943193308, 0.0117734523728633, 0.00438879865028313, 0.00162737834039006, 0.00102263562640706, 0.00256966419093599, 0.00819905987547494, 0.00356380381933028, 0.00459378907571579, 0.0123769394422116, 0.0162725362822941, 0.00770364870061668, 0.0184835516883016, 0.00798092837759707, 0.00574272817857334, 0.00483107847770393, 0.0017089616030636, 0.00334660568350707, 0.0114543838108249, 0.00288212452973156, 0.00448938651825993, 0.00593444755414696, 0.0103782620446864, 0.00424463992722479, 0.0161764747677885, 0.0105032486560586, 0.061974812175287, 0.00528277075107687, 0.000766055202087631, 0.0198394482053174, 0.00734319673771724, 0.00571223067545781, 0.0061683142070276, 0.00170204019314863, 0.00484076438978875, 0.00222693661639841, 0.0204057550556842, 0.00494096746578935, 0.00642331357982557, 0.000845046692055484, 0.0234690091797697, 0.00520249711980663, 0.0141779818674367, 0.0946105742913523, 0.00496222530713291, 0.066585835547389, 0.000763194722436555, 0.0588866152937399, 0.00300507357098326, 0.0662912715588685, 0.00358567303889042, 0.0017549310798091, 0.0222871772118731, 0.00708496651557248), Type = c("knn_vsn", "knn_vsn", "knn_vsn", "knn_vsn", "knn_vsn", "knn_vsn", "knn_vsn", "knn_vsn", "knn_vsn", "knn_vsn", "knn_loess", "knn_loess", "knn_loess", "knn_loess", "knn_loess", "knn_loess", "knn_loess", "knn_loess", "knn_loess", "knn_loess", "knn_rlr", "knn_rlr", "knn_rlr", "knn_rlr", "knn_rlr", "knn_rlr", "knn_rlr", "knn_rlr", "knn_rlr", "knn_rlr", "lls_vsn", "lls_vsn", "lls_vsn", "lls_vsn", "lls_vsn", "lls_vsn", "lls_vsn", "lls_vsn", "lls_vsn", "lls_vsn", "lls_loess", "lls_loess", "lls_loess", "lls_loess", "lls_loess", "lls_loess", "lls_loess", "lls_loess", "lls_loess", "lls_loess", "lls_rlr", "lls_rlr", "lls_rlr", "lls_rlr", "lls_rlr", "lls_rlr", "lls_rlr", "lls_rlr", "lls_rlr", "lls_rlr", "svd_vsn", "svd_vsn", "svd_vsn", "svd_vsn", "svd_vsn", "svd_vsn", "svd_vsn", "svd_vsn", "svd_vsn", "svd_vsn", "svd_loess", "svd_loess", "svd_loess", "svd_loess", "svd_loess", "svd_loess", "svd_loess", "svd_loess", "svd_loess", "svd_loess", "svd_rlr", "svd_rlr", "svd_rlr", "svd_rlr", "svd_rlr", "svd_rlr", "svd_rlr", "svd_rlr", "svd_rlr", "svd_rlr")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -90L))

使用以下代码按Type分组计算PCV均值时,结果中Type会被自动按字母排序:

# dplyr方法
data %>%
  group_by(Type)%>%
  summarise(mean_run = mean(PCV))

# base R方法
result <- stats::aggregate(data$PCV, list(data$Type), mean)

需要保留原始数据中Type分组的出现顺序(knn_vsn → knn_loess → knn_rlr → lls_vsn → lls_loess → lls_rlr → svd_vsn → svd_loess → svd_rlr)。


解决方案

方法1:dplyr管道内处理(保留因子顺序)

将Type转换为因子,指定其水平为原始数据中首次出现的唯一值,这样分组时会遵循因子水平的顺序,而非自动字母排序:

data %>%
  mutate(Type = factor(Type, levels = unique(Type))) %>%
  group_by(Type) %>%
  summarise(mean_run = mean(PCV))

方法2:base R实现(保留原始顺序)

先提取Type的原始出现顺序,再用tapply计算均值后按该顺序整理结果:

# 获取Type的原始唯一顺序
type_order <- unique(data$Type)

# 计算均值并按原始顺序提取
mean_values <- tapply(data$PCV, data$Type, mean)[type_order]

# 转换为目标数据框
result <- data.frame(Type = type_order, mean_run = unname(mean_values))

两种方法最终都会输出符合需求的顺序结果:

structure(list(Type = c("knn_vsn", "knn_loess", "knn_rlr", "lls_vsn", "lls_loess", "lls_rlr", "svd_vsn", "svd_loess", "svd_rlr"), mean_run = c(0.0236972387280275, 0.0140545756246163, 0.0116801617130501, 0.00852058159590288, 0.00827665570788852, 0.00550126183277225, 0.0135468591570967, 0.0177142846257907, 0.0235206963846695)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:45:38