如何在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
相关产品推荐
相关产品推荐

