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

如何在R中聚合数据时保留离散列并取指定行值?

解决分组聚合时混合处理离散列和数值列的问题

我明白你的需求啦——你想把数据集按每15行一组压缩,对数值列(比如columnC、columnD)算均值,同时让离散列(比如columnA、columnB)保留每组第15行的对应值。原来的aggregate代码只能给所有指定列用同一个聚合函数,所以没法实现这种混合逻辑,下面给你两种实用的解决方案:

方案1:用dplyr(简洁直观)

dplyr的分组聚合功能可以轻松给不同列指定不同的处理逻辑,代码可读性很高:

library(dplyr)

# 定义每组的行数
n <- 15

# 执行分组聚合
compressed_df <- df %>%
  # 先给每行分配分组ID
  mutate(group_id = rep(1:(nrow(.) %/% n + 1), each = n, len = nrow(.))) %>%
  # 按分组ID聚合
  group_by(group_id) %>%
  summarise(
    # 离散列取每组最后一行(也就是第15行)的值
    columnA = last(columnA),
    columnB = last(columnB),
    # 数值列计算均值,加na.rm=TRUE避免空值干扰
    columnC = mean(columnC, na.rm = TRUE),
    columnD = mean(columnD, na.rm = TRUE)
  ) %>%
  # 移除分组ID列(如果不需要的话)
  select(-group_id)

方案2:用Base R(无需额外包)

如果你不想加载dplyr,可以用Base R的by函数实现,逻辑和上面一致:

n <- 15

# 创建分组向量
groups <- rep(1:(nrow(df) %/% n + 1), each = n, len = nrow(df))

# 按分组处理并合并结果
compressed_df <- do.call(rbind, by(df, groups, function(group_data) {
  data.frame(
    columnA = group_data$columnA[nrow(group_data)],
    columnB = group_data$columnB[nrow(group_data)],
    columnC = mean(group_data$columnC, na.rm = TRUE),
    columnD = mean(group_data$columnD, na.rm = TRUE)
  )
}))

示例验证

假设你的示例数据是这样的:

set.seed(123) # 保证结果可复现
df <- data.frame(
  columnA = rep(c("Sunday", "Monday"), each = 30),
  columnB = rep(c("Night", "Day"), each = 15),
  columnC = rnorm(60),
  columnD = runif(60)
)

运行上面的代码后,压缩后的数据集里:

  • 第一组(1-15行)的columnA是Sunday,columnB是Night,columnC和columnD是这15行的均值
  • 第二组(16-30行)的columnA是Sunday,columnB是Day,数值列是对应15行的均值
  • 以此类推,完全符合你的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:41:32